java实现插入排序代码
public void insertSort(int[] array) { int length = array.length; //遍历无序区间[1, length) for (int i = 1; i < length; i++) { //表示当前需要被插入到有序区间的元素 int tmp = array[i]; int j; //遍历有序区间[0, i) //不写等于是为了保证排序的稳定性 for (j = i - 1; j >= 0 && array[j] > tmp; j--) { array[j + 1] = array[j]; } array[j + 1] = tmp; }}
代码2(不推荐):在遍历有序区间找对应位置时,由于每次比较都可能进行次交换,时间和空间上会造成一定程度的浪费,因此效率不如代码1
public void insertSort2(int[] array) { int length = array.length; //遍历无序区间[1, length) for (int i = 1; i < length; i++) { //遍历有序区间 for(int j = i; j >0; j--) { //如果待排序元素小于有序区间的最后一个元素就与其交换 if(array[j] < array[j - 1]) { int tmp = array[j]; array[j] = array[j - 1]; array[j - 1] = tmp; } } }}
折半插入排序
同样是将待排序区间分为了有序和无序两个区间,但是在遍历插入位置时采用了二分查找的方式找到要插入的位置后将有序区间中该位置后的的元素向后搬移一位然后将要插入的元素插入代码:
public void bsInsertSort(int[] array) { for(int i = 1; i < array.length; i++) { int tmp = array[i]; int left = 0; int right = i; //在有序区间内进行二分查找操作,找到要插入的位置 while(left < right) { int mid = (right + left) >>> 1; if(array[mid] <= tmp) { left = mid + 1; } else { right = mid; } } //将有序区间内[left, i)中的元素向后移动一位 for(int j = i - 1; j >= left; j--) { array[j + 1] = array[j]; } array[left] = tmp; }}
性能分析时间复杂度:最好的情况:待排序有序时,时间复杂度为O(N)最坏的情况:待排序逆序时,时间复杂度为O(N^2)平均情况:时间复杂度 为O(N^2)空间复杂度:O(1)稳定性:稳定初始数据越接近有序,时间效率越高
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。