黑马程序员————java实现插入排序,附其改进--二分检索的插入排序
2015-09-26 00:00
691 查看
------www.itheima.com Java培训、Android培训、iOS培训、.Net培训期待与您交流!
-------
关于插入排序,如果忘记了原理,请自行百度或参考《算法导论》第2章,温故而知新!
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
。关于改进的插入排序,方式1的时间复杂度没有明显改进,方式2一般情况下可以明显缩短时间。关于其时间复杂度的研究,还请自行脑补
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shy.gif)
。
1、插入排序的java源码:
2、改进的插入排序(植入二分检索)java源码:
实现方式1(时间与输入的数组原顺序不同有差异):
方式2(一般情况下,会缩短排序时间):
3、调式源码:
4、结果:
-------
关于插入排序,如果忘记了原理,请自行百度或参考《算法导论》第2章,温故而知新!
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
。关于改进的插入排序,方式1的时间复杂度没有明显改进,方式2一般情况下可以明显缩短时间。关于其时间复杂度的研究,还请自行脑补
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shy.gif)
。
1、插入排序的java源码:
/** * 插入排序:从小到大 * @param array * @return 排序花费的时间 */ public static long insertSort(int[] array){ long beginTime = System.currentTimeMillis(); for(int i=1;i<array.length;i++){ int temp = array[i];//temp 作为要插入的值 int j=i-1; //往前搜索,大于temp的值往后搬 while(j>=0 && array[j]>temp){ array[j+1] =array[j]; j--; } //由循环不变性,可知插入之前的子数组都是排好序的,所以直接从第一个小于temp值处插入(前面的数肯定小于temp) array[j+1]=temp; } long endTime = System.currentTimeMillis(); return endTime- beginTime; }
2、改进的插入排序(植入二分检索)java源码:
实现方式1(时间与输入的数组原顺序不同有差异):
/** * 改进的插入排序(植入二分查找):从小到大--不稳定 * @param array * @return 排序花费的时间 */ public static long insertSortImprove(int[] array){ long beginTime = System.currentTimeMillis(); int min =-1; int max =-1; int mid =-1; for(int i=1;i<array.length;i++){ //保证前两个数有序 if(array[i]>array[i-1]){ continue; } int temp = array[i]; //通过二分法查找 min = 0 ; max = i-1; while(min <= max){ mid= (min+max)/2; if(array[mid] == temp){ break; } if(array[mid] <temp){ min = mid+1; }else { max = max-1; } } //将值往后搬 for(int k=i;k>mid;k--){ array[k] = array[k-1]; } array[mid] = temp; } long endTime = System.currentTimeMillis(); return endTime- beginTime; }
方式2(一般情况下,会缩短排序时间):
public static long insertSortImprove(int[] array){ long beginTime = System.currentTimeMillis(); int high,low,mid=0; for(int i=1;i<array.length;i++){ int temp = array[i]; high = i; low = 1;//low==0,以0开始会出错,index=0时 mid = (high+low)/2;//与放在循环里有区别! while(low<=high){ if(array[mid-1] == temp) { break ;//相等就跳出,不能少,否则出现相等的数判断是会死循环! } else if(array[mid-1] > temp){ high = mid - 1; mid = (high+low)/2; } else{ low = mid + 1; mid = (high+low)/2; } } for(int k=i;k>mid;k--){ array[k] = array[k-1]; } array[mid]=temp; } long endTime = System.currentTimeMillis(); return endTime- beginTime; }
3、调式源码:
/** * 插入排序的改进 * 加入二分法检索 * @author Smilexs * */ public class InsertSort { private static int N = 10;//排序数 public static void main(String[] args) { long sortTime = 0; int[] array1 = new int ; int[] array2 = new int ; //初始化数组,随机整数赋值 for(int i=0;i<N;i++){ int temp = (int)(Math.random()*N); array1[i] = temp; array2[i] = temp; } System.out.println("原数组:"+Arrays.toString(array1)); //插入排序 sortTime = insertSort(array1); // System.out.println("普通的插入排序时间:"+sortTime+"ms"); System.out.println("普通的插入排序:"+Arrays.toString(array1)); //二分检索的插入排序 sortTime = insertSortImprove(array2); // System.out.println("二分法检索的插入排序时间:"+sortTime+"ms"); System.out.println("二分法检索的插入排序:"+Arrays.toString(array2)); }}
4、结果:
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树