您的位置:首页 > 其它

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

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

就平均时间而言,该算法具有较高效率(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: