1. 插入排序的原理理解:
正如我们打牌时的抽牌方式。我们先把数组分成左右半区。左半区最开始一个数,其余的数为右半区。从右半区一个个拿出数,插入左半区。
2. 插入排序java实现:
/**从小到大排序
* @param list
*/
public static void InsertionSort(double[] list) {
//从右半区一个个拿出数来插
for (int i = 1; i < list.length; i++) {
// 准备插入第i个索引
double currentElement = list[i];//提取i索引数字,方便k向后挪。
int k;//左半区的从右向左一个个与i索引比较
// 当第k个索引比i小的时候(即i比list[k]大),终止循环
for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
// 每一轮,k向后挪一格,空出位置(当然,实际上k索引还存在着数)
list[k + 1] = list[k];
}
//终止循环后下面的k+1即为上一轮的k位置
//i插入空出的位置
list[k + 1] = currentElement;
}
}
3. 插入排序的最坏情况的时间复杂度和理解:O(n^2)
最坏情况 :右半区每一个数,都和所有左半区的数比较。
第一轮比较1次
第二轮比较2次
…
第n -1轮比较n - 1次
所以 1 + 2 + 3 + … + ( n - 1 )= O(n^2)
4. 插入排序的平均时间复杂度和理解:O(n^2)
最坏情况是,右半区每一个数,都和所有左半区的数比较。
平均情况是,右半区每一个数,都和一半的左半区的数比较。
平均来说,
第一轮比较1/2次,
第二轮比较2/2次
第三轮比较3/2次,
…
第n - 1轮比较( n - 1 )/2次,
所以 1/2 + 2/2 + 3/2 + … + ( n - 1 )/2 = O(n^2)