插入排序
算法思想:将一个数组分为前后有序与无序两个部分,首先把数组的第一个元素当作一个有序序列,然后将后面的无序序列的第一个元素与有序序列的尾部元素开始依次往前比较,如果带插入的无序元素比有序序列中的元素小,则将当前做比较的有序元素往后移动一个单元,否则将待插元素插入至当前有序序列元素的后一个单元。直至将无序序列部分的元素全部插入至有序部分。
代码实现:
#include<stdio.h>
void InsertSort(int arr[], int lenth){
int i, j, temp;
for(i = 1; i < lenth; i++){ //外循环控制有序部分
temp = arr[i]; //temp 暂存为待插元素
j = i - 1;
for (; j >= 0&&temp < arr[j]; j--)//从有序序列的后面依次向前比较
arr[j + 1] = arr[j];
arr[j + 1] = temp;
printf("第%2d次循环后的结果:",i);
for(int x = 0; x < 12; x++)
printf("%3d", arr[x]);
printf("\n");
}
}
int main(void){
int arr[12] = {5,9,6,3,7,8,1,2,4,9,2,4};
InsertSort(arr, 12);
return 0;
}
输出结果:
第 1次循环后的结果: 5 9 6 3 7 8 1 2 4 9 2 4第 2次循环后的结果: 5 6 9 3 7 8 1 2 4 9 2 4第 3次循环后的结果: 3 5 6 9 7 8 1 2 4 9 2 4第 4次循环后的结果: 3 5 6 7 9 8 1 2 4 9 2 4第 5次循环后的结果: 3 5 6 7 8 9 1 2 4 9 2 4第 6次循环后的结果: 1 3 5 6 7 8 9 2 4 9 2 4第 7次循环后的结果: 1 2 3 5 6 7 8 9 4 9 2 4第 8次循环后的结果: 1 2 3 4 5 6 7 8 9 9 2 4第 9次循环后的结果: 1 2 3 4 5 6 7 8 9 9 2 4第10次循环后的结果: 1 2 2 3 4 5 6 7 8 9 9 4第11次循环后的结果: 1 2 2 3 4 4 5 6 7 8 9 9
时间复杂度为O(n^2),
稳定性: 稳定。 因为排完序后,相同元素的前后顺序与排序前相同。