我相信咱们大部分人肯定都玩过扑克牌,就拿斗地主来举例,其实插入排序就是斗地主中的摸牌的过程,我们在摸牌的时候,会做出如下的操作:
第一步:将已经在手上的牌进行排序
第二步:摸牌
第三步:把摸到的牌和手上的牌进行比较,如果摸到的牌比手上的牌小,就把手上的牌往后挪动,一直挪到摸到的牌比手上的牌大为止,然后将摸到的牌插入到手上的牌中即可
根据如上思路,我们可以写出如下代码:
#include <stdio.h>
void InsertSort(int* arr,int n)
{
//假设[0...end]已经排序,现在想要排序的是第N+1
for (int i = 0; i < n - 1; i++)
{
int end = i; //我认为这里是插入排序的精髓,数组中的第一个数肯定是有序的,所以从第一个第二个数开始比较
int tmp = arr[end + 1];
//建立一个循环,将tmp和前end个数进行比较
while (end >= 0) //如果数组里面还有数据(手头上还有牌)
{
if (arr[end] > tmp) //如果要插入的牌比手头上的牌要小
{
arr[end + 1] = arr[end]; //就把手头上的牌往后挪一个
end--; //比较下一张牌
}
else 如果要插入的牌比手头上的牌要大
{
break; //退出当前循环
}
}
arr[end + 1] = tmp; //把要插入的牌放到后一个位置,意思为插入完成
}
}
int main(void)
{
int arr[] = { 2,4,6,8,10,1,3,5,7,9 };
InsertSort(arr, sizeof(arr) / sizeof(int));
for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
待排数据是2,4,6,8,10,1,3,5,7,9。排序后如下: