zoukankan      html  css  js  c++  java
  • 快速排序,对于相同元素的优化,c++

    #include<iostream>
    using namespace std;

    void middl(int &p,int &q,int &r)//找枢轴,然后把枢轴位置都换到第一位,左中右从小到大,取中值,放在左边第一个
    {

    if (p > q) swap(p, q);
    if (p > r) swap(p, r);
    if (q > r) swap(q, r);
    swap(p, q);

    }

    void quicksort(int *a,int L,int R)//和枢轴相同的数可以和枢轴放一起来缩小下次快排的规模
    {

    if (L < R)
    {
    int mid = (L + R)/2;
    middl(a[L],a[mid],a[R]);
    int count1 = L, count2 = R;
    int i = L, j = R, key = a[L];

    while (i < j)//一趟快排的总控制
    {
    while (i < j && a[j] > key)j--;//控制j从后往前找第一比key小的
    while (i < j)
    {
    if (a[j] == key)//在右边找到和枢轴相同的数放到数组最右端
    {
    int term;
    term = a[count2];
    a[count2] = a[j];
    a[j] = term;//在右边找到和枢轴相同的数放到数组最右端
    count2 --;
    j--;
    while (i < j && a[j] > key)j--;//找到和key相同的数移动后还要继续找比key小的
    }
    else
    {
    a[i++] = a[j];//因为轴值已经记录为key,而a[0]为轴值
    break;//加个break是为了一旦找到比key值小的就不再循环
    }

    }
    while (i < j && a[i] < key)i++;//控制i从右往左找第一个比key大的
    while (i < j)
    {
    if(a[i] == key)//在左边找到的和key相同的值放到数组最左端
    {
    int term;
    term = a[count1];
    a[count1] = a[i];
    a[i] = term;//在左边找到的和key相同的值放到数组最左端
    count1 ++;
    i++;
    while (i < j && a[i] < key)i++;
    }
    else
    {
    a[j--] = a[i];
    break;
    }

    }
    }
    a[i] = key;//现在a[i]里面值并不是key而是最近比key大或者小的值,但是已经赋值给了i或者j最近变动的地方,所以要复制key,也没有事情
    int pivot = i;//用一个变量保存当前枢轴位置,因为下边ij都变了,
    for(int t1 = L;t1 < count1;t1 ++)//最左边与key值相同的数,与i左边的值交换
    {
    int term;
    term = a[--i];
    a[i] = a[t1];
    a[t1] = term;
    }
    for(int t2 = R;t2 > count2;t2 --)//最左边与key值相同的数,与i左边的值交换
    {
    int term;
    term = a[++j];
    a[j] = a[t2];
    a[t2] = term;
    }
    quicksort(a,L,pivot - count1 - 1 + L);
    quicksort(a,pivot + R - count2 + 1,R);
    }
    }

    int main()
    {

    int num;
    cout<<"请输入排序的规模!"<<endl ;
    cin>> num;
    int *a = new int[num];
    int i;
    for(i = 0;i < num;i++)
    {
    cin>>a[i];
    }
    cout<<"输出原始数组!"<<endl;
    for(i = 0;i < num;i++)
    {
    cout<<a[i]<< " ";
    }
    cout<<endl;

    quicksort(a,0,num - 1);
    for(i = 0;i < num;i++)
    {
    cout<<a[i]<< " ";
    }


    cout<<endl;
    return 0;
    }

  • 相关阅读:
    智慧出行--maas
    hystrix动态修改参数
    hystrix元素详解
    hystrix讲解:熔断降级隔离以及合并请求
    幂等性概念
    设计模式之Command
    Unity AssetBundle工作流
    unity share current game screen
    `Facebook.Unity.Settings' has already been imported error solution
    IOException: win32 io returned 267. Path:
  • 原文地址:https://www.cnblogs.com/working-in-heart/p/9836198.html
Copyright © 2011-2022 走看看