实际快速排序 -分割策略
来源:互联网 发布:linux jdk tar.gz下载 编辑:程序博客网 时间:2024/06/05 20:55
快速排序,枢纽元(比较值)理论上选哪个都可以。实际快速排序包括划分策略 和递归调用。
public static <AnyType extends Comparable<? super AnyType>>void quicksort(AnyType [] a){ quicksort(a, 0, a.length-1);}private static final int CUTOFF= 3;public static <AnyType> void swapReferences(AnyType [] a, int index1, int index2){ AnyType tmp= a[index1]; a[index1]= a[index2]; a[index2]= tmp;}private static <AnyType extends Comparable<? super AnyType>>AnyType median3(AnyType [] a, int left, int right){ //left, center, 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); //center(pivot)放到right-1位置 swapReferences(a, center, right-1); return a[right-1];}private static <AnyType extends Comparable<? super AnyType>> void quicksort(AnyType [] a, int left, int right){ if(left+CUTOFF <= right); { AnyType pivot= median3(a, left, right); //Begin partitioning int i= left, j= right-1; for(;;) { //++前缀操作符能保证比较前,推进,若是后缀运算符,当a[i]=a[i]=pivot 时出现死循环 while(a[++i].compareTo(pivot) < 0) {} while(a[--j].compareTo(pivot) > 0) {} if(i < j) swapReferences(a, i, j); else break; //i 不可能等于j, 因为上面两个while语句 互斥, i和j不可能指向同一个位置。 } //restore pivot swapReferences(a, i, right-1); quicksort(a, left, i-1); quicksort(a, i+1, right); } else insertionSort(a, left, right);}
0 0
- 实际快速排序 -分割策略
- 快速排序:分割。
- 快速排序 一般分割
- 快速分割排序
- 分治策略----快速排序
- 快速排序中的霍尔分割
- 快速排序一趟分割,单循环
- 快速排序之分割数组
- 快速排序的原理及实际应用
- 快速排序中的分割算法实现
- 算法中分治策略实现快速排序
- 随机选择策略的快速排序
- 递归与分治策略之快速排序
- 快速排序的枢纽元选取策略
- 分治策略实现快速排序法
- 递归与分治策略之快速排序
- 递归与分治策略-2.8快速排序
- 分而治之——快速排序(分割交换排序)
- java中获取距离当前时间最近的时间
- 偶然发现的Android Studio使用小技巧/快捷键的合集
- 保证前端请求方式和后台处理方式一致
- 值传递与引用传递的区别?
- Linux Page cache和Block I/O layer
- 实际快速排序 -分割策略
- 486. Predict the Winner
- MySQL架构由小变大的演变过程
- 大整数取模的一点理解
- woowj
- Codeforces 777E 贪心
- Spring学习及整合遇到的问题(二)
- 开发一个好项目:九、android奔溃日记记录系统
- 解析Java的多线程机制