C直接插入排序 主函数调用
先上代码,排序可视化:
https://visualgo.net/zh/sorting
#include <stdio.h>
void Printarr(int arr[], int length); // print arrary
void InsertSort(int arr[], int length); // sort
int main(int argc, char const *argv[])
{
int arr[] = {45, 29, 40, 25, 98, 77, 46, 20, 21, 21};
int length = sizeof(arr) / sizeof(arr[0]);
Printarr(arr, length);
InsertSort(arr, length);
puts("finish sort!");
Printarr(arr, length);
return 0;
}
void Printarr(int arr[], int length)
{
int i;
for (i = 0; i < length; i++)
printf("%d ", arr[i]);
printf("\n");
}
void InsertSort(int arr[], int length)
{
int i, j, temp;
// 此时的array[0]作为已排序位置
// 遍历所有无序元素,从下标1开始
for (i = 1; i < length; i++)
{
temp = arr[i]; // 需要插入到前面的 无序元素
j = i - 1; // 已排序的最后一个元素下标
while (j >= 0 && arr[j] > temp)
{
arr[j + 1] = arr[j]; // 将已排序的元素右移
j--; // 继续向前对比
}
// 在适当位置插入
arr[j + 1] = temp;
}
}
其中while循环还可以写成for形式:
void InsertSort(int arr[], int length)
{
int i,j,temp;
for(i=1;i<length;i++){
temp = arr[i]; // unsort element
for(j=i-1;j>=0&&arr[j]>temp;j--){
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
result:
45 29 40 25 98 77 46 20 21 21
finish sort!
20 21 21 25 29 40 45 46 77 98
伪代码思路:
伪代码
假设第一个元素认为已排序,
遍历剩余未排序的元素
提取第一个未排序的元素作为临时变量temp
遍历已排序的元素,将其和temp做比较,如果temp小于排序的元素,就将排序的元素右移给temp空出位置。
当遇到temp大于已排序的元素时,插入到当前位置。
注意:
其中内循环需要遍历已排序的元素,从后往前遍历,找到比temp小的元素,然后插入到前面,其中需要不断将比temp大的元素往右移,之前temp的位置会被最后一个已排序的元素所替代。
时间复杂度:直接插入排序和冒泡排序、选择排序的平均时间复杂度一样都是O(N^2);