插入排序是最简单的排序算法之一,由N-1趟排序组成,每趟p位置排序都保证从0到当前位置p为有序状态。下面看图表:
原始数组 | 8 | 3 | 22 | 56 | 6 | 8 | 移动的位置 |
p=1趟排序之后 | 3 | 8 | 22 | 56 | 6 | 8 | 1 |
p=2趟排序之后 | 3 | 8 | 22 | 56 | 6 | 8 | 0 |
p=3趟排序之后 | 3 | 8 | 22 | 56 | 6 | 8 | 0 |
p=4趟排序之后 | 3 | 6 | 8 | 22 | 56 | 8 | 3 |
p=5趟排序之后 | 3 | 6 | 8 | 8 | 22 | 56 | 2 |
表格中每趟排序将p元素向左移动,直到移动到他的正确位置。因为每一趟的排序都花费n次迭代,因此插入排序时间复杂度为O(),最好情况下需要排序的数组已经是有序的时间复杂度为O(N)。下面附上java代码:
/**
* 插入排序
* @param arrays
*/
public static void insertionSort(int[] arrays){
int j;
for(int p=1;p<arrays.length;p++){
int temp = arrays[p];
// 将大于p位置的元素左移
for(j=p;j>0 && arrays[j-1]>temp;j--){
arrays[j] = arrays[j-1];
}
// 将p放入正确的位置
arrays[j] = temp;
}
}
参考:数据结构与算法分析 java语言描述(原书第3版)