#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; }