排序算法之快速排序

来源:互联网 发布:天猫推荐算法大赛数据 编辑:程序博客网 时间:2024/06/10 16:54

快速排序

最差时间复杂度\Theta(n^2)最优时间复杂度\Theta(n\log n)平均时间复杂度\Theta(n\log n)最差空间复杂度根据实现的方式不同而不同

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。——快速排序.维基百科


(图片引自维基百科)

个人理解的快速排序算法:欲对序列data[]作快速排序,1)将data[]的第一个元素(上图为最后一个元素)存为key;2)通过赋值,一轮调整将所有小于key的元素调整至key的左边,将所有大于key的元素调整至key的右边;3)用递归的方法分别对key左边与右边的子序列作快速排序;4)函数出口为:子序列最多只有一个元素。

函数代码:

/* *快速排序 */void QuickSort(int data[], int low, int high){/* 快速排序data[low..high) *//* 每一轮对序列的调整,使得所有大于第一个元素key的元素位于key的右边, *//*以及所有小于key的元素位于key左边 *//* 最后分别对key左右两边的子序列作快速排序 */if (high - low < 2){/* 单元素区间 */return;}int key = data[low];/* 保存第一个元素 */int i = low, j = high - 1;while (i < j){while (i < j && key <= data[j]){/* 逆序寻找小于key的元素 */j--;}if (i < j){/* 将小于key的元素调整至key左边 */data[i++] = data[j];}while (i < j && data[i] <= key){/* 顺序寻找大于key的元素 */i++;}if (i < j){/* 将大于key的元素调整至key右边 */data[j--] = data[i];}}//while (i < j)data[i] = key;/* 将key置于正确位置 */QuickSort(data, low, i);QuickSort(data, i + 1, high);}



0 0
原创粉丝点击