• 差点搞不懂快排


    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    
    const int NUM = 25;
    
    /**
        这里默认使用的pivot是a[left]
        partition将 a[]分成两部分,左边的部分小于pivot,右边的部分大于pivot
    
    **/
    
    ///两种partition方式都是对的
    /*
    int partition(int a[],int left, int right) //分割
    {
        int base=a[left];    //基准元素
        while(left < right)
        {
            while(left < right && a[right] >= base)
                --right;     //从右向左找第一个比基准小的元素
    
            a[left]=a[right];
    
            while(left < right && a[left] <= base )
                ++left;      //从左向右找第一个比基准大的元素
    
            a[right]=a[left];
        }  ///不会像下面一个一样产生交叉,因为在每个while循环里面都保证了这一点
    
        a[left]=base;
        return left;
    }
    */
    
    int partition(int a[],int left, int right)
    {
     int L = left;
     int R = right;
     while(left < right)
     {
         ///两个内层循环的方式left和right这两个下标会产生交叉
      while(a[left] <= a[L] && left != R)///每次找出一个比pivot大的下标
       left++;
    
      while(a[right] >= a[L] && right != L)///每次找出一个比pivot小的下标
       right--;
    
      std::swap(a[left],a[right]);///交换这两个数,注意最后一次交换的时候left 和 right发生了交叉
     }
     std::swap(a[left],a[right]);///交叉的下标对应的元素不用交换,使用下面一步来完成一次分割
     std::swap(a[L],a[right]);///因为此时a[right] 是小于 pivot的,所以需要交换
     return right;
    }
    
    void QuickSort(int a[],int left,int right)
    {
        int i;
        if(left<right)
        {
            i=partition(a,left,right);   //分割
            QuickSort(a,left,i-1);     //将两部分分别排序
            QuickSort(a,i+1,right);
        }
    }
    
    
    int main()
    {
    
     int a[NUM] = {0};
    
        srand(time(NULL));
     for(int i = 0; i < NUM; i++)
            a[i] = rand() % 100;
          // a[i] = i ;
    
        random_shuffle(a,a+NUM);
    
        for(int i = 0; i < NUM; i++)
     {
      cout << a[i] << " ";
     }
        cout << endl;
    
    
     QuickSort(a, 0, NUM - 1);
    
     for(int i = 0; i < NUM; i++)
     {
      cout << a[i] << " ";
     }
     cout<<endl;
    
        return 0;
    }
    
     
  • 相关阅读:
    MongoDB查询修改操作语句命令大全
    SpringBoot读取war包jar包Resource资源文件解决办法
    linux lsof命令详解
    taskset
    POI导出excel,本地测试没问题,linux测试无法导出
    js中文乱码
    处理Account locked due to 217 failed logins的问题
    普通用户无法su到root用户
    gp数据库停止
    eclipse导入maven工程missing artifact(实际是存在的)错误解决
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2481934.html
Copyright © 2020-2023  润新知