排序篇--随机快速排序

算法描述:
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
动画演示:
实现逻辑:
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法流程如下:
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

核心代码段:

import java.util.Arrays;

public class code_04_QuickSort {
    public static void quicksort(int[] arr)
    {
        if (arr == null || arr.length < 2)
        {
            return;
        }
        quicksort(arr ,0 ,arr.length -1 );
    }

    public static void quicksort(int[] arr,int i,int j)
    {
        if (i < j)
        {
            //random quicksort
          swap(arr, i + (int) (Math.random() * (j - i + 1)), j);
          int[] p = partition(arr, i, j);
          quicksort(arr,i,p[0] -1);
          quicksort(arr,p[1] +1,j);
        }
    }

    public static int[] partition(int[] arr ,int l,int r)
    {
        int less = l -1;
        int more = r;
        while (l < more)
        {
            if (arr[l] < arr[r])  //less+1
            {
                swap(arr,++less,l++);
            }
            else if (arr[l] > arr[r]) //more +1
            {
                swap(arr,more--,l++);
            }
            else     //相等 不动more 和 less
            {
                l++;
            }
        }
        swap(arr,more,r);   //more 和基准交换 完成partition动作
        return new int[] {less+1,more};
    }

    public static void swap(int[] arr,int i,int j)
    {
        arr[i] = arr[i]^arr[j];
        arr[j] = arr[i]^arr[j];
        arr[i] = arr[i]^arr[j];
    }

总结:

经典快排的效率依赖于数据的原始状态,代码实现为随机快排,减少对原始数据的依赖性,将下列一行注释即为经典快排代码。

swap(arr, i + (int) (Math.random() * (j - i + 1)), j);

posted on 2021-08-05 22:00  机器猫007  阅读(488)  评论(0)    收藏  举报

导航