您的位置:首页 > 其它

快速排序及其分析

2014-07-25 14:33 274 查看
快速排序设计思路:

第一步:选取枢纽元,一般通过输入数据的左端,右端和中心位置上的三个元素的中值作为枢纽元

第二步:分割,根据枢纽元的值,将小于枢纽元的值分割到S1,大于枢纽元的值分割到S2,此时分割方法是将枢纽元值放在最后,i指向数据开头,j指向

数据结尾,I跟枢纽元比较,小于枢纽元就右移,j跟枢纽元比较,大于枢纽元就左移。当I,j停住,i和j比较,i大于j就交换i,j位置,直到结束。最后将枢纽元

与i位置的值交换,这样在枢纽元左边的值就小于枢纽元,右边的值大于枢纽元。特殊情况,如果i或j遇到与枢纽元相等的关键字,那么我们将i,j同时停止为好。

第三步:将S1和S2排序,就得到了排序结果

快速排序设计:

public static <AnyType extends Comparable<? super AnyType>> void quicksort(AnyType[] a){

quicksort(a,0,a.length-1);

}

private static <AnyType extends Comparable<? super AnyType>> AnyType median3(AnyType[] a,int left,int right){

int center = (left+right)/2;

if(a[center].compareTo(a[left])<0)

swapReferences(a,left,center);

if(a[right].compareTo(a[left])<0)

swapReferences(a,left,right);

if(a[right].compareTo(a[center])<0)

swapReferences(a,center,right);

swapReferences(a,center,right-1);

return a[right-1];

}

private static <AnyType extends Comparable<? super AnyType>> void quichsort(AnyType[] a,int left,int right){

if(left+CUTOFF<=right){

AnyType pivot = median3(a,left,right);

int i=left,j=right-1;

for(;;){

while(a[++i].compareTo(pivot)<0){}

while(a[--j].compareTo(pivot)>0){}

if(i<j)

swapReferences(a,i,j);

else

break;

}

swapReferences(a,i,right-1);

quicksort(a,left,i-1);

quicksort(a,i+1,right);

}else

insertionSort(a,left,right);

}

上面的CUTOFF用于检测是否符合小数组的截止方法,因为归并排序处理小数组(N<=20)其执行效率不如插入排序等这些对小数组有效的排序算法

归并排序分析:

归并排序最坏运行时间O(N²),最好运行时间O(NlogN),平均运行时间O(NlogN)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: