整理下前一阵学的排序算法(2)
来源:互联网 发布:捉握手包软件 编辑:程序博客网 时间:2024/05/16 00:33
归并排序和快速排序
1. 归并排序
原地归并的抽象方法
public static void merge(Comparable[] a, int lo, int mid, int hi){ int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) aux[k] = a[k]; for(int k = lo ; k <= hi; k++) if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (less(aux[j],aux[i])) a[k] = aux[j++]; else a[k] = aux[i++];}
自顶向下的归并排序
public class Merge{ private static Comparable[] aux; public static void sort(Comparable[] a) { aux = new Comparable[a.length]; sort(a, 0, a.length - 1); } private static void sort(Comparable[] a, int lo, int hi) { if(hi <= lo) return; int mid = lo +(hi - lo)/2; sort(a, lo, mid); sort(a, mid+1, hi); merge(a, lo, mid, hi); }}
2. 快速排序
public class Quick{ public static void sort(Comparable[] a) { StdRandom.shuffle(a); //消除对输入的依赖 sort(a, 0, a.length-1); } private static void sort(Comparable[] a, int lo, int hi) { if(hi <= lo) return; int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); } private static int partition(Comparable[] a, int lo, int hi) { int i = lo, j = hi + 1; //左右扫描指针 Comparable v = a[lo]; //切分元素 while(true) { while(less(a[++i], v)) if(j == hi) break; while(less(v, a[--j])) if(j == lo) break; if(i >= j) break; exch(a, i, j); } exch(a, lo, j); //将v = a[j]放入正确的位置 return j; //a[lo..j-1] <= a[j] <= a[j+1..hi]达成 }}
0 0
- 整理下前一阵学的排序算法(2)
- 整理下前一阵学的排序算法(1)
- 前一阵出的游戏程序测试题目
- 从零开始学算法:十种排序算法介绍(下)
- 从零开始学算法:十种排序算法介绍(下)
- 从零开始学算法:十种排序算法介绍(下)
- 从零开始学算法:十种排序算法介绍(下)
- 从零开始学算法:十种排序算法介绍(下)
- 排序算法的整理(1)
- 简单的排序算法整理(一)
- 数据结构之排序算法整理(2)
- 排序算法的比较整理
- 整理的排序算法总结
- 排序算法的代码整理
- 常用的排序算法整理
- 整理的常见排序算法
- 我前一阵写的MAX7的模型导出插件和浏览器
- 排序算法004-前3中排序算法的比较
- Android学习基本索引(三)——记录,没事自己看
- 线段树+离散化问题
- MapReduce
- jQuery中的on方法
- 从C++文件中读取数据到vector的简捷方法
- 整理下前一阵学的排序算法(2)
- plist 字段大全
- 黑马程序员——io的九种文件复制方式
- Android学习实践:11.进度条ProgressBar
- C编程语言中的循环结构(loops)
- gdb之x命令
- 用Clojure愉快的写个小parser(未完待续...)
- MySQL存储过程入门
- 为什么C#中显示接口不能加访问修饰符