选择排序、插入排序、希尔排序与归并排序
来源:互联网 发布:app软件怎么制作 编辑:程序博客网 时间:2024/05/19 18:48
(1)选择排序
public class Sortexample { public void exch(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void selection(int[] a){ int len = a.length; for(int i = 0;i < len;i++){ int minindex = i; for(int j = i + 1;j < len;j++){ if(a[minindex] > a[j]) minindex = j; } if(minindex != i){ exch(a,i,minindex); } } } public static void main(String[] args) { // TODO Auto-generated method stub Sortexample example = new Sortexample(); int[] a = new int[]{1,3,4,2,5,8,7,6}; example.selection(a); for(int i = 0;i < a.length; i++) System.out.println(a[i]); }}
运行轨迹:
(2)插入排序
public class Sortexample { public void exch(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void insertsort(int[] a){ int len = a.length; for(int i = 1; i < len; i++){ for(int j = i;j > 0;j--){ if(a[j] < a[j-1]){ exch(a,j-1,j); } } } } public static void main(String[] args) { // TODO Auto-generated method stub Sortexample example = new Sortexample(); int[] a = new int[]{1,3,4,2,5,8,7,6}; example.insertsort(a); for(int i = 0;i < a.length; i++) System.out.println(a[i]); }}
运行轨迹如图:
插入排序对于部分有序的数组十分高效,也很适合小规模的数组
选择排序与插入排序对比:
(3)希尔排序
public class Sortexample { public void exch(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void shellsort(int[] a){ int len = a.length; int h = 1; while(h < len) h = 3*h+1; while(h >= 1){ for(int i = h;i < len ;i++){ for(int j = i;j >= h;j-=h){ if(a[j]<a[j-h]){ exch(a,j-h,j); } } } h=h/3; } } public static void main(String[] args) { // TODO Auto-generated method stub Sortexample example = new Sortexample(); int[] a = new int[]{1,3,4,2,5,8,7,6}; example.shellsort(a); for(int i = 0;i < a.length; i++) System.out.println(a[i]); }}
运行轨迹:
(4)归并排序
自顶向下的归并
public class Sortexample { private static int[] aux;//用于归并时存储 //将两个有序数组进行归并 public void mergesort(int[] a){ aux = new int[a.length]; sort(a,0,a.length-1); } public void merge(int[]a,int lo,int mid,int hi){ int i = lo; int j = mid + 1; for(int k = lo;k <= hi;k++)//注意k与hi可以取等 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(a[j] < a[i]) a[k] = aux[j++]; else a[k] = aux[i++]; } } public void sort(int[] a,int lo,int hi){ if(hi<=lo) return; int mid = (lo + hi)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); } public static void main(String[] args) { // TODO Auto-generated method stub Sortexample example = new Sortexample(); int[] a = new int[]{1,3,4,2,5,8,7,6}; example.mergesort(a); System.out.println(Arrays.toString(a)); }}
自底向上的归并排序:
public class MergeBU{ private static int[] aux;//归并所需的辅助数组 public static void sort(int[] a){ int N = a.length; aux = new int[N]; for (int sz=1;sz<N;sz=sz+sz){ for(int lo=0;lo<N-sz;lo+=sz+sz){ merge(a,lo,lo+sz-1,Math.min(lo+sz+sz-1,N-1));//merge方法与自顶向下一致,都是合并两个有序数组 } } }}
归并排序的优化:用不同的方法处理小规模问题能改进大多数递归算法的性能,因为递归会使小规模问题中方法的调用过于频繁,所以改进对它们的处理方法可以改进整个算法。使用插入排序处理小规模的子数组(比如长度小于15)一般可以将归并排序的运行时间缩短%10-%15.
1 0
- 选择排序、插入排序、希尔排序与归并排序
- 插入排序、冒泡排序、选择排序与希尔排序、快速排序、归并排序
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序
- 冒泡排序,插入排序,快速排序,归并排序,堆排序,选择排序,希尔排序
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序六大排序大总结
- Python 排序 冒泡排序 希尔排序 快速排序 插入排序 选择排序 归并排序
- 插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 选择排序,插入排序,冒泡排序,希尔排序,快速排序,归并排序
- 责任链模式
- |NOIOJ|动态规划|2985:数字组合
- 排序算法--直接插入排序
- Android--day03 Button 添加监听的方法
- flask学习笔记
- 选择排序、插入排序、希尔排序与归并排序
- HDU1879-继续畅通工程(Prim算法+Kruskal算法)
- μC/OS-Ⅱ中的任务
- 16.9.10大连网赛感想
- Android-day03--添加监听的第三种方法
- Linux运维笔记----部署FTP服务器
- |洛谷|动态规划|P1616 疯狂的采药
- 总结 day07
- g2o编译及配置