您的位置:首页 > 职场人生

黑马程序员————java实现插入排序,附其改进--二分检索的插入排序

2015-09-26 00:00 691 查看
------www.itheima.com Java培训、Android培训、iOS培训、.Net培训期待与您交流!
-------
关于插入排序,如果忘记了原理,请自行百度或参考《算法导论》第2章,温故而知新!

。关于改进的插入排序,方式1的时间复杂度没有明显改进,方式2一般情况下可以明显缩短时间。关于其时间复杂度的研究,还请自行脑补



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、结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息