插入排序算法思想:
假设数组中有N个数,则:
1)先使得数组0到0范围上有序(这个范围上只有一个数,显然是有序的);
2)再使得数组0到1范围上有序;
3)再使得数组0到2范围上有序;
……)以此类推,最终,使得数组0到N-1范围上有序,至此,数组完成排序。
按照插入排序算法的思想,数组在0到n-1(n>0)范围上已经有序时,如何实现数组在0到n范围有序:
此时将n位置的数与n-1位置的数作比较,如果n位置的数比n-1位置的数小,则交换这两个数的位置,然后,将n-1位置的数与n-2位置的数进行比较,如果n-1位置的数比n-2位置的数小,则交换这两个数的位置,……,以此类推,直至数组前一位置的数不比当前位置的数小,或者,当前位置已经是0位置,此时,实现数组在0到n范围的有序。
插入排序代码:
public class InsertionSort {
public void insertionSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
insertionSort(arr,0,arr.length - 1);
}
public void insertionSort(int[] arr,int l,int r){
if(l == r){
return;
}
for(int i = l + 1;i <= r;i++){
for(int j = i;j > l && arr[j] < arr[j - 1];j--){
swap(arr,j,j-1);
}
}
}
public void swap(int[] arr,int i ,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
插入排序时间复杂度:
O(N^2)
插入排序额外空间复杂度:
O(1)