• 差点搞不懂快排


    #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;
    }
    
     
  • 相关阅读:
    day12. 闭包
    day11.函数的全局变量和局部变量
    day10.函数基础及函数参数
    day9.关于文件的操作
    day7.关于字符串的相关操作
    day8.列表、字典、集合相关操作
    day6. while双项循环及for循环
    LeetCode-Unique Binary Search Trees II
    LeetCode-Unique Binary Search Trees
    LeetCode-Edit Distance
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2481934.html
Copyright © 2020-2023  润新知