基本思想:
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序记录全部插入为止。类似于打牌时插入,时间复杂度为O(n^2),是一种稳定排序。
代码演示:
public static void insertionSort(int [] arr) { if (arr == null || arr.length<2 ){ return; } //0~0 有序的 //0~i 想有序 for (int i = 0; i <arr.length ; i++) {//0~i 做到有序 for (int j = i-1; j >=0 && arr[j]>arr[j+1] ; j--) { swap(arr,j,j+1); } } } private static void swap(int[] arr, int i, int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[i]^arr[j]; arr[i]=arr[i]^arr[j]; }
二分法插入排序
public static void insertSort(int arr[]){ int left,right,mid; for (int i = 0; i <arr.length ; i++) {//0~i 做到有序 for (int j = i-1; j >=0 && arr[j]>arr[j+1] ; j--) { left=1;right=i-1; while(left<=right){ mid=left+(right-left)/2; if (arr[0]<arr[mid]){ right=mid-1; }else { left=mid+1; } } swap(arr,j,j+1); } } } public static void swap(int[] arr, int i, int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[i]^arr[j]; arr[i]=arr[i]^arr[j]; } public static void main(String[] args) { int arr[]={4,4,6,5,3,2,8,1,9,3,5,6,7,12,23,34,21,22,14,19}; insertSort(arr); System.out.println(Arrays.toString(arr)); }