一、插入排序
1、思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动
2、时间复杂度:
最好:O(N),正序情况,只有比较时间,无移动时间
最坏:O(N2),逆序情况
平均:O(N2)
3、辅助空间:O(1)
4、稳定性:稳定
5、适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高
1 public static void insertSort(int[] a) { 2 int target,i,j; 3 for(j = 1;j<a.length;j++) {//当前带插入的元素下标 4 target = a[j]; 5 while(j>0&&target < a[j-1]) { 6 a[j] = a[j-1];//向后移动 7 j--; 8 } 9 a[j] = target; 10 } 11 } 12
二、希尔排序
1、思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个记录基本有序时,再对整个记录进行一趟插入排序,步长最后必减少为1
2、时间复杂度:
最好:O(N1.3)
最坏:O(N2)
平均:根据步长不同
3、辅助空间:O(1)
4、稳定性:不稳定,插入排序本身稳定,但是由于有步长,所以不稳定
5、适用场合:关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。
public static void shellSort(int[] a) { int i,j,r,temp; for(r = a.length/2;r >= 1;r = r/2) { //r为步长 for(i = r;i < a.length;i++) { temp = a[i]; j = i - r; while(j >= 0 && temp < a[j]) { a[j+r] = a[j]; j-= r; } a[j+r] = temp; } } }