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

来源:互联网 发布:mysql 触发器 性能 编辑:程序博客网 时间:2024/06/08 00:17
------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[N];int[] array2 = new int[N];//初始化数组,随机整数赋值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、结果:



0 0
原创粉丝点击