您的位置:首页 > 产品设计 > UI/UE

QuickSort 快速排序

2017-03-23 17:22 686 查看

快速排序算法:

思路:

在QSort函数中,设置一个枢轴pivot,Partition函数中选择第一个数当作枢轴变量,经过循环交换,使得它左边的值都比它小,右边的值比它大;然后再递归调用QSort函数。

注:在最优的情况下,时间复杂度变O(nlogn);在最坏的情况下,时间复杂度为O(n^2)。空间复杂度为O(logn)。由于关键字的比较和交换是跳跃式进行的,因此,快速排序是一种不稳定的排序方法。

代码实现:

//快速排序(排序后为从小到大)
#include <iostream>
#include <algorithm>
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,且*(p+high)>=枢轴变量,则--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;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: