插入排序
数据结构 | 数组 |
---|---|
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O (n^2) |
平均时间复杂度 | O(n^2) |
空间复杂度 | O(1) |
排序方式 | in-place |
稳定性 | 稳定 |
比较次数 | n*(n-1)/2 |
适用场景 | 初始序列大量有序 |
步骤:
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
图片出处:https://www.cnblogs.com/chengxiao/p/6103002.html
/// <summary> /// 插入排序 /// </summary> public class InsertSort : SortBase, ISort { public void Sort() { int j; // // 前i个元素是已排序的 for (int i = 1; i < arr.Length; i++) { int temp = arr[i];// 暂存第i个元素 // 第i个元素和依次和之前的元素比较 for (j = i; j > 0 && temp < arr[j - 1]; j--) { arr[j] = arr[j - 1]; } if (j != i) { arr[j] = temp; } base.output(arr); } } //反着写一下 public void Sort2() { int j; for (int i = arr2.Length - 2; i >= 0; i--) { int temp = arr2[i]; for (j = i; j < arr2.Length - 1 && temp > arr2[j + 1]; j++) { arr2[j] = arr2[j + 1]; } if (i != j) { arr2[j] = temp; } base.output(arr2); } } }
结果: