常用排序算法总结----快速排序(java实现)

快速排序使用分治策略来把一个序列(list)分为两个子序列(sub-lists)。步骤为:

①. 从数列中挑出一个元素,称为”基准”(pivot)。
②. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

实现思路:

快速排序的算法思想其实比较简单,先找出一个数作为基准数(通常取数组最小下标或者最大下标位置的数字)。定义两个变量作为“哨兵”,然后分别从后向前,从前向后两个方向去“探测”:

  1. 从后向前:寻找比基准数小的数据,如果找到,停下来
  2. 从前向后:寻找比基准数大的数据,如果找到,停下来
  3. 如果两个方向的“探测”都找到了符合要求的数据,则交换数据,继续顺着方向寻找
  4. 直到两个哨兵碰到一起,此时把相遇位置上的数据和基准数(即数组的中间位)交换数据
  5. 此时,基准数左侧的数都小于等于基准数,右侧的数都大于等于基准数
  6. 同样的方法去“探测”基准数左侧和右侧的数据(使用递归) 

                        常用排序算法总结----快速排序(java实现)_第1张图片 

代码如下:

    public static void QuickSort(int[] arr){
        // 定义两个哨兵  分别为 数组的最小下边  和数组的最大下标
        sort(arr,0,arr.length-1);

    }

    public static void sort(int[] arr , int left ,int right){
        if(leftpvtion && left

以下是快速排序算法复杂度:

最坏时间复杂度
最优时间复杂度
平均时间复杂度
最坏空间复杂度 根据实现的方式不同而不同

 虽然它运行最糟糕时将达到O(n²)的时间复杂度, 但通常平均来看, 它的时间复杂为O(nlogn), 快速排序似乎更偏爱乱序的数列, 越是乱序的数列, 它相比其他排序而言, 相对效率更高.

Tips: 同选择排序相似, 快速排序每次交换的元素都有可能不是相邻的, 因此它有可能打破原来值为相同的元素之间的顺序. 因此, 快速排序并不稳定.

  

你可能感兴趣的:(常用排序算法)