排序-归并排序-优化(插入排序+复制采用System.arraycopy)
来源:互联网 发布:php开源投票系统 编辑:程序博客网 时间:2024/05/16 19:20
package xwq.sort;import xwq.util.StdIn;import xwq.util.StdOut;/** * 优化后的归并排序 * 使用插入排序优化 * copy操作由原来的循环复制改为使用 * java API:System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length) */public class MergeSortX { private static int CUTOFF = 10;//插入排序临界值 public static void sort(Comparable[] a) { Comparable[] acopy = new Comparable[a.length]; sort(a,acopy,0,a.length-1); } private static void sort(Comparable[] a,Comparable[] acopy,int low,int high) { if(low >= high) return; //插入排序优化 if((high-low+1) <= CUTOFF) { insertSort(a,low,high); return; } int mid = (low+high)/2; sort(a,acopy,low,mid); sort(a,acopy,mid+1,high); merge(a,acopy,low,mid,high); } //合并两个已经递增有序的数组a[low,mid],a[low+1,high] private static void merge(Comparable[] a,Comparable[] acopy,int low,int mid,int high) { //for(int i = low;i<=high;i++) // acopy[i] = a[i]; //copy待排序部分数组到辅助数组 //System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length) //使用System.arraycopy快于使用循环复制 System.arraycopy(a, low, acopy, low, high-low+1); //左半待合并数组a[low,mid],右半待合并数组a[low+1,high] int i = low; //待合并左半部分数组起点位置 int j = mid+1;//待合并右半部分数组起点位置 int k = low; //合并数组起点位置 while(k<=high) { //左半数组已全部插入 if(i>mid) a[k++] = acopy[j++]; //右半数组已全部插入 else if(j>high) a[k++] = acopy[i++]; //左半数组目前所指向的元素值<右半数组所指向的元素值 else if(less(acopy[i],acopy[j])) a[k++] = acopy[i++]; //左半数组目前所指向的元素值>=右半数组所指向的元素值 else a[k++] = acopy[j++]; } } //插入排序 private static void insertSort(Comparable[] a,int low, int high) { for(int i = low+1;i<=high;i++) { Comparable insert = a[i]; int pos = i-1; while(pos>=low && less(insert,a[pos])) { a[pos+1] = a[pos]; pos--; } a[pos+1] = insert; } } //v<w private static boolean less(Comparable v,Comparable w) { return v.compareTo(w) < 0; } //输出排序数组 public static void print(Comparable a[]) { for(int i = 0;i<a.length;i++) StdOut.print(a[i]+" "); } //测试函数 public static void main(String[] args) { String[] a = StdIn.readAllStrings(); sort(a); print(a); }}
0 0
- 排序-归并排序-优化(插入排序+复制采用System.arraycopy)
- 【排序】归并排序利用插入排序优化
- 插入排序与归并排序及优化
- 排序之一(插入排序、归并排序)
- 插入排序、归并排序
- 插入排序,归并排序
- 插入排序&归并排序
- 插入排序&&归并排序
- 排序(插入排序,希尔排序,归并排序,快速排序)
- 归并排序中对小数组采用插入排序
- 排序(插入,堆排序,归并)
- 插入排序与归并排序
- 归并排序和插入排序
- 插入排序及归并排序
- 插入排序和归并排序
- 插入排序和归并排序
- 插入排序和归并排序
- 插入排序与归并排序
- IOS图片压缩(修改图片大小)
- 详解Hadoop核心架构HDFS+MapReduce+Hbase+Hive
- Ubuntu 设置环境变量
- uva1471 - Defense Lines (最长上升子序列变形)
- IIS配置本地域名解析
- 排序-归并排序-优化(插入排序+复制采用System.arraycopy)
- Xamarin.Forms教程开发Xamarin.Forms应用程序需要的工具
- 【rabbitmq】 com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel erro
- Android Studio查看SVN历史记录不能正确显示中文
- ceph 学习笔记
- APK瘦身方案
- J2EE的基础学习_jsp_servlet_获得连接池
- leetcode69---Sqrt(x)(求x的平方根)
- C++Primer第五版 12.1.6节练习