插入排序
一:基本思想
解释:
就像打扑克牌一样,我们手里的是已经排好序的牌,然后去摸一张牌来进行插入到排好序的牌,使得整体再度成为一个有序的牌。
二:代码思路
1:我们手里的牌要有序
所以我们从一开始空手的时候就对即将摸到的牌进行排序,第一张牌就放在第一位就是有序的,从第二张牌开始就要进行插入排序以确保整体有序。
2:从第二张牌开始怎么插入?
假设第二张牌记作tmp,所以tmp要和前一张牌对比,大于等于前一张牌,就放在它的后面,比它小就要继续和前面的牌对比,直到终于遇到大于等于前一张牌的时候,就把tmp停留在前一张牌的后面,但也有可能没有比tmp更小的牌(比如牌里没有3,摸到了3),所以tmp就应该放在最左面。
三:代码展示
arr代表接收的数组,N代表数组的元素数目
//插入排序函数
void InsertSort(int* arr, int N)
{
for (int i = 0; i < N - 1; i++)
{
int end = i;
//即将排序的元素,保留在tmp
int tmp = arr[end + 1];
//end>=0代表还有元素未比较
while (end >= 0)
{
if (tmp < arr[end])
{
arr[end + 1] = arr[end];
end--;
}
else
{
break;
}
}
//来到这里分为两种情况
//1:break->遇到比元素tmp小或和tmp相等的,将m放在它的后面
//2:全部比较完了,都没有遇到<=tmp的,最后tmp放在数组第一个位置
arr[end + 1] = tmp;
}
}
另一种写法:
解释:
1:随着我们手里牌的增多,end代表最后一张牌的下标,所以end也会逐渐增多,最后end的下标应该是N-2,也就是倒数第二张牌的下标,然后进行最后一张牌的插入
也就是:随着数组元素数目的增加,end也会逐渐增加,最后应该是N-2(数组的倒数第二个元素的下标),然后进行最后一个元素的插入排序
2:第二张牌记作tmp,所以tmp要和前一张牌对比,大于等于前一张牌,就放在它的后面,比它小就要继续和前面的牌对比,直到终于遇到大于等于前一张牌的时候,就把tmp停留在前一张牌的后面,但也有可能没有比tmp更小的牌(比如牌里没有3,摸到了3),所以tmp就应该放在最左面。
也就是:每次插入排序的end,会随着比较而递减,直接tmp遇到<=自己的元素,或者end为0(代表全部都和tmp进行了比较),才会跳出while
3:所以我们把arr[end+1] = tmp;放在了while的外面
这样不管哪种情况都可以完美的进行插入。
end一定是由 i 来进行赋值,不能直接把end写到for循环里,因为for内会对end的量进行改变,无法控制!!!
四:main函数及效果展示
//主函数
int main()
{
//生产随机数
srand(time(0));
//数组大小为10
int N = 10;
//为数组 开辟空间
int* arr = (int*)malloc(sizeof(int) * N);
//生成十个随机数,放进数组中
for (int i = 0; i < N; i++)
{
arr[i] = rand() % 100;
}
//打印插入排序前的数组
for (int i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
//插入排序
InsertSort(arr, N);
//打印排序后的数组
for (int i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
//释放空间
free(arr);
return 0;
}
原文地址:https://blog.csdn.net/shylyly_/article/details/141939206
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!