快速排序普通法与中值枢纽元法以及三切法
来源:互联网 发布:淘宝客订单失效原因 编辑:程序博客网 时间:2024/06/11 22:59
快速排序影响速度的一个因素便是枢纽元,在这里第一种方法为将第一个元素作为枢纽元,这样做有一个弊端,就是当顺序为逆序时或者大量重复的数时T(N) = O(N^2),方法一是中值枢纽法,即将第一个,中间的,和最后一个取中值,并将他们放在合适的位置,然后递归,这里有一点与普通法不同,i=left,j=right -1(中值法);i = left,j=right+1(普通法)且在最后的交换也不同!还有一点要注意----递增i和j时必须用前自增,如果用后自增,后面交换的值便是当前值得下面的值,这点需要注意,还有就是边界检查,中值法并不需要,因为将中值放在right-1处,a[i]不会大于中值,且a[j]不会小于i!
下面是对比代码:
<span style="font-size:14px;">package 排序;import java.util.Arrays;public class Qsort {private final static int CUTOFF = 10; /* * normal way *//*public static void qSort(int[] a,int left,int right){//if(left + CUTOFF >= right) insertion(a,left,right);//optimize with insertion sort//else{if(left >= right) return;//int p = median3(a,left,right);//System.out.println(p);int p = a[left];int i = left,j = right + 1;//set head pointer and tail pointerwhile(true){while(i!=right&&a[++i] < p){}while(j!=left&&a[--j] > p){}if(i<j) swap(a,i,j);else break;}swap(a,left,j);//put the pivot in the right posqSort(a,left,j-1);qSort(a,j+1,right);//}}*//* * median way */public static void qSort(double[] a,int left,int right){if(left + CUTOFF >= right) insertion(a,left,right);//optimize with insertion sortelse{//System.out.println("processing");if(left >= right) return;double p = median3(a,left,right);//System.out.println(p);int i = left,j = right + 1;//set head pointer and tail pointerwhile(true){while(a[++i] < p){}while(a[--j] > p){}if(i<j) swap(a,i,j);else break;}swap(a,right-1,i);//put the pivot in the right posqSort(a,left,i-1);qSort(a,i+1,right);}}public static double median3(double[] a,int lo,int hi){int mid = (lo+hi)/2;if(a[lo] > a[mid]) swap(a,lo,mid);if(a[lo] > a[hi] ) swap(a,lo,hi);if(a[mid] > a[hi]) swap(a,mid,hi);swap(a,mid,hi-1);//hide pivotreturn a[hi-1];//return pivot}public static void swap(double[] a,int i,int j){double temp = a[i];a[i] = a[j];a[j] = temp;}public static void insertion(double[] a,int lo,int hi){//System.out.println(lo);for(int i=lo;i<=hi;i++){for(int j=i;j>0&&a[j]<a[j-1];j--){swap(a,j,j-1);}}}public static void main (String[] args){double a[] = new double[100000];//datafor(int i=0;i<a.length;i++){a[i] = (double)Math.random()*100000;}qSort(a,0,a.length-1);long after = System.currentTimeMillis(); System.out.println(Arrays.toString(a));}}</span>
0 0
- 快速排序普通法与中值枢纽元法以及三切法
- 快速排序的枢纽元选取策略
- 快速排序代码(选择最右值最为枢纽元)
- 三数中值作为枢纽元方法
- 快速排序枢纽值(基元)选择方法(转载)
- 高级排序-快速排序,最右边的值为枢纽
- 快速排序基于不同枢纽的实现方法
- 快速排序-常见中轴(主元pivot)选择方法及实现代码(末位/随机/三数中值/..)
- 筛选法求素数 & 普通法求素数
- 三中值和插入排序混合实现快速排序
- 快速排序以及归并排序
- 冒泡排序以及快速排序
- Gradle中AndroidManifest中值的替换与快速渠道打包
- PAT_1045 快速排序(主元个数)
- 快速中值滤波
- 快速找中值
- 快速中值求取算法
- List.Sort以及快速排序
- 正式进入IT行业——Android程序
- 海康视频rtsp
- Python实现归并排序的两种方法
- 重拾编程之路--jeetcode(java)-- Remove Nth Node From End of List
- 【iOS】Quartz 2D图片压缩和裁剪
- 快速排序普通法与中值枢纽元法以及三切法
- 浅谈andro studio怎么导入dependecy(新特性,jar包,三方module)
- 《leetCode》:Unique Binary Search Trees II
- 【ITOO】S0A
- C语言快速删除列表选中项算法
- monkey 测试工具
- 简易在线投票系统(php)——投票页面
- application对象
- 索引截断搜索的一种方法