2、稳定排序二——插入排序
2、插入排序
-
通过插入和比较 来排序:
- 插入时 首先和前面序列的最后一个元素比较,如果要插入的元素更大,则该元素放在序列的最后;反之,则向前遍历,直到找到比要插入的元素小的元素,然后插入这个元素的后面即可。
- 注意,由于插入排序是原地排序,所以当小于末尾元素时 需要移动元素,层层覆盖
-
稳定性:如果要插入的元素和当前遍历的元素相等,也插入到该元素的后面。因为原序列前面的元素先插,后面的元素后插,所以相等的元素顺序不变,故稳定
-
时间复杂度 on^2 ,空间 o1,稳定排序,原地排序
-
代码:
void print(vector<int>& a, int n, int i) {
cout << "step"<< i << ": ";
for (int j = 0; j < n; j++) {
cout << a[j] << " ";
}
cout << endl;
}
void insertionSort(vector<int>& a, int n) {//{ 9,1,5,6,2,3 }
for (int i = 1; i < n; ++i) // 从第二个元素开始遍历
{
j = i - 1;// j指向前一个元素
int x = a[i];
if (x < a[j]) // 比较它和前面序列的最后一个元素,如果是>,什么都不用做了;如果是<,说明要移动元素了
{
a[i] = a[j];//移到i的位置
j--;// j指向倒数第二个元素
while (j >= 0 && x < a[j]) // 只要 x < a[j]了,说明就要移动元素了
{
a[j + 1] = a[j];// 把a[j]往后移一格
j--; //指向前一个元素
}
//若x>a[j]了,则x放在它后面。放心,原先在这个位置的元素已经往后移一格了
a[j + 1] = x;
}
print(a, n, i); //打印每趟排序的结果
}
}