#include <iostream> #include <ctime> using namespace std; //以最高位的数字作为划分元素(好理解) int partition(int *a,int low,int high) { int i = low-1; int j = high; int parti = a[high]; //以最高位的数字作为划分元素 while(1) { while(a[++i] < parti); //从左到右找到第一个比parti大的数a[i] while(a[--j] > parti) //从右到左找到第一个比parti小的数a[j] if(i >= j) //,如果i>=j,则退出该循环 break; if(i >= j) //如果此时i>=j,则退出循环 break; swap(a[i],a[j]); //交换a[i]、a[j] } swap(a[i],a[high]); //交换a[i]、a[high] return i; //并将i作为划分指针 } //以最高位的数字作为划分元素(来自算法导论,但是较难理解) int partition1(int *a,int low,int high) { int parti = a[high]; int i = low-1; for(int j=low;j<=high-1;j++) if(a[j]<=parti) { i++; swap(a[i],a[j]); } swap(a[i+1],a[high]); return i+1; } //以最低位的数字作为划分元素 int partition2(int a[],int low,int high) { int i = low; int j = high+1; int parti = a[low]; //以最低位的数字作为划分元素 while(1) { while(a[--j] > parti); //从右到左找到第一个比parti小的数a[j] while(a[++i] < parti) //从左到右找到第一个比parti大的数a[i] if(i >= j) //,如果i>=j,则退出该循环 break; if(i >= j) //如果此时i>=j,则退出循环 break; swap(a[i],a[j]); //交换a[i]、a[j] } swap(a[j],a[low]); //交换a[j]、a[low] return j; //将j作为划分指针 } void qsort(int a[],int low,int high) { if(low<high) { int pos = partition(a,low,high); qsort(a,low,pos-1); qsort(a,pos+1,high); } } //*******最好理解的版本******* //对a[s]到a[t]的元素进行快速排序 //调用格式:QuickSort(a,0,n-1),a为数组,n为数组长度 void QuickSort(int a[],int s,int t) { int i = s,j = t; int tmp; if(s<t) { tmp = a[s]; //tmp暂存起始元素 while(i != j) { while(j>i && a[j]>=tmp) //从右到左找到第一个比tmp小的数 j--; a[i] = a[j]; //将a[j]移至a[i]的位置上 while(i<j && a[i]<=tmp) //从左到右找到第一个比tmp大的数 i++; a[j] = a[i]; //将a[i]移至a[j]的位置上 } a[i] = tmp; //将起始元素tmp移至a[i]的位置 QuickSort(a,s,i-1); //i为分割点下标,a[i]为分区元素 QuickSort(a,i+1,t); } } int main() { int N; cout<<"Input count of number: "; cin>>N; srand((unsigned)time(NULL)); int *a = new int[N]; for(int i=0;i<N;i++) { a[i] = rand(); cout<<a[i]<<" "; } cout<<endl; qsort(a,0,N-1); for(int i=0;i<N;i++) cout<<a[i]<<" "; delete []a; return 0; }