您的位置:首页 > 其它

快速排序8

2016-05-21 16:52 225 查看
快速排序的总体平均效率是最好的。

要领:

1. 选取轴点(枢轴)pivot;

2. 循环加递归,把比pivot小的放在左侧,大的放在右侧。

Partition函数(选取pivot的函数)要做的,就是先选取当中的一个关键字,然后想尽办法将它放到一个位置,使得它左边的值都比它小,右边的值比它大。我们将这样的关键字称为枢轴(pivot)。

在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。

在最坏的情况下,待排序的序列为正序或者逆序,时间复杂度为O(n2)。

就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn)。最坏情况,需要进行n-1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。

可惜的是,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。

测试用例:

//测试用例
int main(){
//待排序数组
int arr[10] = {34, 55, 12, 34, 234, 57, 57, 89, 123, 7};
//遍历数组
for(auto i = 0; i < 10; ++i)
std::cout << arr[i] << " ";
std::cout << std::endl;

//快排
QuickSort(arr, 0, 9); //参数:数组名,开始下标位置, 结束下标位置

//遍历排序后的数组
for(auto i = 0; i < 10; ++i)
std::cout << arr[i] << " ";//Output: 7 12 34 34 55 57 57 89 123 234

return 0;
}


快排函数实现:

//选取枢轴(轴点)
int Partition(int *data, int low, int height){
//输入是否合法
if(data == NULL || low < 0 || height <= 0)
throw new std::exception("Invalid parameters.");

//将第一个值作为枢轴值
int pivotValue = data[low];

//使得pivot左边的值比它小,右边的值比它大
while(low < height){  //内部两个循环比较
while(low < height && data[height] >= pivotValue) //大于轴值不作交换,因为其本身就在轴值右侧
height--;
std::swap(data[low], data[height]); //否则,将小于枢轴值的交换到底端
while(low < height && data[low] <= pivotValue)  //小于轴值不做交换,因为其本身就在轴值左侧
low++;
std::swap(data[low], data[height]); //否则,将大于枢轴值的交换到高端
}
return low; //返回枢轴所在的位置
}

//快排,递归的
void QuickSort(int *data, int low, int height){
//先判断,也是递归基
if(low == height)
return;
//选定枢轴
int pivot;
if(low < height){
//定枢轴
pivot = Partition(data, low, height); //以枢轴为界
QuickSort(data, low, pivot - 1); //对左侧递归排序
QuickSort(data, pivot + 1, height); //对右侧递归排序
}
}


此版本复杂度较高,可有其他优化版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: