本文共 1507 字,大约阅读时间需要 5 分钟。
思路:
在QSort函数中,设置一个枢轴pivot,Partition函数中选择第一个数当作枢轴变量,经过循环交换,使得它左边的值都比它小,右边的值比它大;然后再递归调用QSort函数。 注:在最优的情况下,时间复杂度变O(nlogn);在最坏的情况下,时间复杂度为O(n^2)。空间复杂度为O(logn)。由于关键字的比较和交换是跳跃式进行的,因此,快速排序是一种不稳定的排序方法。代码实现:
//快速排序(排序后为从小到大)#include#include using namespace std; int Partition(int *p, int low, int high){ int pivotkey; pivotkey = *(p + low);//设置传进来的数组中第一个数为枢轴变量 while (low < high){ while (low < high&&*(p + high) >= pivotkey){ //如果low =枢轴变量,则--high --high; } swap(*(p + low), *(p + high));//交换值 while (low < high&&*(p + low) <= pivotkey){ ++low; } swap(*(p + low), *(p + high)); } return low;//返回枢轴}void QSort(int *p,int low,int high){ int pivot;//设置枢轴,即在这个位置,它左边的值比它小,右边的值比它大 if (low < high){ pivot = Partition(p+low, 0, high-low);//用来初步排序 QSort(p+low, 0, pivot -1-low);//递归调用自己,这里传的p+low,是新截断数组第一个位置的指针,所以后面的要用0t pivot-1-low QSort(p + pivot + 1, 0, high - pivot - 1); }}void QuickSort(int (&a)[9]){ int asize = sizeof(a) / sizeof(a[0]);//取数组的大小 int *p = a;//指针p指向a的首地址 QSort(p, 0, asize - 1);}int main(){ int a[] = { 5, 1, 9, 3, 7, 4, 8, 6, 2 }; cout << "before sorted:" << endl; for (size_t i = 0; i < 9; ++i){ //输出 cout << a[i] << " "; } cout << endl; QuickSort(a); cout << "after sorted:" << endl; for (size_t i = 0; i < 9; ++i){ //输出 cout << a[i] << " "; } cout << endl; return 0;}
运行结果: