利用随机化的思想对快速排序进行优化

来源:互联网 发布:税务师考试含金量 知乎 编辑:程序博客网 时间:2024/05/17 00:58

        快速排序的基本思想是利用一轮排序让待排记录分为两部分,其中一部分均比另一部分小,然后再分别对两部分采用相同的思想进行排序。假设待排为一数组,首先任意选取一个记录(通常选择第一个记录)作为枢轴,然后按下述原则重新排列记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字都较它大的记录都安置在它的位置之后。这个过程即为一轮快速排序。

         就平均时间而言,该算法具有较高效率(O(nlogn))。但当待排序记录的关键字有序或基本有序时,该算法退化为起泡排序,时间复杂度为O(n2)。

         为改进之,引入随机化的思想,及枢轴的位置并非始终为第一个记录,而是随机的选择一个记录作为枢轴。具体代码如下:

import java.util.Random;public class RQuickSort {public RQuickSort() {// TODO Auto-generated constructor stub}public void RQSort(int []a, int low, int hight) {if(low < hight){int pivotkey = Partition(a, low, hight);RQSort(a, low, pivotkey-1);RQSort(a, pivotkey+1, hight);}}public int Partition(int [] a , int low, int hight){//随机的给出枢轴的位置Random random = new Random();int index = random.nextInt(hight-low+1)+low;int temp = a[index];a[index] = a[low];a[low] = temp;int pivotkey = a[low];while(low < hight){while(low<hight && a[hight] >= pivotkey)--hight;int k = a[hight];a[hight] = a[low];a[low] = k;while(low<hight && a[low] <= pivotkey)++low;k = a[low];a[low] = a[hight];a[hight] = k;}return low;}}


原创粉丝点击