直接插入排序(Insert Sort)稳定的一种排序
直接插入排序的思想:
- 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
- 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
- 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
例如给定一串数字 5 3 7 8 2
j i
让 arr[i] 为第二个数 j 从零号下标开始向后走,如果第一个数字大于第二个数字,进行交换,否则i+1,开始进行下一次循环。
#include<stdio.h>
void InsertSort(int *arr,int len)
{
for(int i = 1;i < len;i++)
{
int tmp = arr[i];
int j = 0;
for(j = i-1;j >= 0;j--)
{
if(arr[j] > tmp)
{
arr[j+1] = arr[j];
}
else
{
break;
}
}
arr[j+1] = tmp;
}
}
void Show(int *arr,int len)
{
for(int i = 0;i < len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {5,3,7,8,2};
int len = sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,len);
Show(arr,len);
return 0;
}
直接插入排序的时间复杂度为O(n^2) 最好情况为O(n)越有序越快,
空间复杂度为O(1)。