• 快速排序,对于相同元素的优化,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;
    }

  • 相关阅读:
    【SQL Server】数据库是单个用户的 无法顺利进行操作 怎么解决
    【java 断点续传】
    【SQL 触发器】
    【SQL 数据库】将一张数据表信息复制到另一张数据表
    【java 获取数据库信息】获取MySQL或其他数据库的详细信息
    【zTree】 zTree使用的 小例子
    【前台 ajax】web项目前台传递数组给后台 两种方式
    【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
    Linux 在VMware中搭建CentOS6.5虚拟机
    HTML5 Canvas实现360度全景图
  • 原文地址:https://www.cnblogs.com/working-in-heart/p/9836198.html
Copyright © 2020-2023  润新知