快速排序及其分析
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)
第一步:选取枢纽元,一般通过输入数据的左端,右端和中心位置上的三个元素的中值作为枢纽元
第二步:分割,根据枢纽元的值,将小于枢纽元的值分割到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)
相关文章推荐
- 快速排序及其分析
- 快速排序及其分析
- GDI+编程中的一条错误信息及其原因分析
- 一个小语言的词法分析程序原理及其实现(2)
- 电力系统潮流的计算及其分析控制(中)
- 绝对能够测试你的C语言功力的几个问题及其讲解分析
- CRC原理及其逆向分析方法
- 电力系统潮流的计算及其分析控制(下)
- ARP地址解析协议详解及其漏洞分析
- [导入]激励的迟延效应及其分析
- 一个小语言的词法分析程序原理及其实现(1)
- Delphi中三种延时方法及其定时精度分析
- Delphi中三种延时方法及其定时精度分析
- 电力系统潮流的计算及其分析控制(上)
- GDI+编程中的一条错误信息及其原因分析
- 值交换的两种方法及其效率分析
- Delphi中三种延时方法及其定时精度分析
- SqlServer链接服务器配置及其在作业更新时出现 [SQLSTATE 42000](错误 7410)的分析处理
- 三层架构各层关系分析比较及其约定