- 基本思想
插入排序是一种简单的排序算法,其基本思想是将第一个记录看成是一个有序子序列,再依次从第二个记录起逐个插入到这个有序的子序列中。一般来说,在第i步上,将R(i)插入到R(i)~R(i-1)构成的有序子序列。
插入排序算法由嵌套的两个for循环组成,外层for循环n-1次,内层for循环比较复杂,循环次数依赖于第i个元素前关键字值比elem[i].key大的元素个数。
- 复杂度分析
在最坏的情况下,每个循环都必须移动到数组的最前面,即原数组元素是逆序。这时第一趟循环1次,第二趟循环2次,依次类推,总比较的次数为 n(n-1)/2=O(n2)。
在最好的情况下,数组元素已经按关键字递增排序,这时每个内层循环到的元素都不需要移动,总的比较次数为n-1,所以此时的时间复杂度为O(n)。
如果待排序元素是随机的,也就是排序的元素可能出现的概率是相同的,这时可取最坏情况和最好情况的平均值,平均时间复杂度为O(n2)
- 代码实现
1 public int[] sort1(int[] array) { 2 // 直接插入排序 3 for (int i = 1; i < array.length; i++) { 4 int tmp = array[i]; 5 int j = i; 6 while (tmp < array[j - 1]) { 7 array[j] = array[j - 1]; 8 j--; 9 } 10 array[j] = tmp; 11 } 12 return array; 13 }