快速排序 暑假补习之排序算法

来源:互联网 发布:2017网络教育统考时间 编辑:程序博客网 时间:2024/06/12 01:23

按照排序算法的实用分析,快速排序也许是性能最高的一种排序算法了。

1. 简单complexity分析

时间复杂度O(nlogn)

最坏情况O(n^2) :如果pivot的选择不恰当的话。 当然看过博客写过实际环境中,选pivot可选第一个元素,也可随机选择,也可以规律选择,比如在头尾以及中间元素间选择,我个人的观点是按实际情况分析,因为我理解的程序不是照搬,数据结构和算法都千变万化,只选择最适合当前的情况的最符合自己思维习惯的即可,当然要符合bug free的规律。

空间复杂度O(nlogn)

2. 不稳定排序

按照WIKI的解释,不稳定排序是在两个或多个相等元素在排序之后,可使相对位置发生改变的一种排序。不稳定排序算法的种类比较多,知道稳定排序的基本排序算法即可。如下:

冒泡排序(BubbleSort) 插入排序(Insertion Sort) 归并排序(MergeSort)基数排序(Radix Sort)

3.  快速排序主要思想

当我前期学习快速排序时,非常迷惑,后来知道一个原理就是小的放在pivot左边,大的放在pivot右边。当然这只是快速排序的一个步骤,就是选择分割点。那么分治算法的“分”的第一步就在这里实现。那么选择pivot是个仁者见仁的事情了,可根据需求进行分析,哪里选择pivot是可以对程序运行质的提高的。pivot的移动主要就是通过交换,一步步的交换会把pivot放在最终位置,那个位置就是分割点,左边的是小的,右边的值比分割点大。

4. 基本代码:

基本流程:

public static int[] quickSort(int[] test, int low, int high){if(low < high){int pivot = getPivot(test,low,high);//得到pivotquickSort(test,low, pivot-1);//递归排序pivot左边数据   quickSort(test,pivot+1,high);//递归排序pivot右边数据}return test;


获取Pivot的代码:

//version 1: 此代码思想是借鉴网友的,并非我自己写的,特此标注

public static int getPivot(int[] array, int start, int end  ){int key = array[start];while(start < end){while(start < end && array[end]  >= key) end --;array[start] = array[end];while(start < end && array[start] <= key )start++;array[end] = array[start];}array[start] = key;return start;}}

//version2:
// 这段代码是按照自己的理解写的,看起来sloppy。 留下来给自己 做耻笑状 之用。

public static int partition(int[] test, int low, int high){int key = test[low];int tmp =0;while(low<high){while(test[high] >= key && low<high) high--;if(test[high] < key) {tmp = test[high];test[high] = test[low];test[low]= tmp;low ++;}while(test[low]<=key && low <high) low++; if(test[low] > key){tmp = test[high];test[high] = test[low];test[low]= tmp;high--;}}return low;}


5. 综合排序算法分析,请参考:
这篇文章写的比较详尽:
http://www.cnblogs.com/ziyiFly/archive/2008/09/10/1288516.html
(本文是本人暑假补习记录,写的不好,欢迎大家吐槽,写的不对,欢迎大家指正)