一、总体逻辑:
1. 取出待排元素
2. 将有序的部分(此处的有序默认为 小->大 )中,大于待排元素的元素后移一位
3. 将待排元素插入至空位
二、解释:
1. 取出待排元素,待排元素从1索引开始(因为0索引就一个数,一个数排个锤锤),此时数组中会有一个空位(记住这个空位)
2. 将有序的部分中,大于待排元素的元素后移一位,那留下的那个空位右边不就是全是大于待排元素的,左边不就是全部小于待排元素的
3. 然后将待排元素放到空位上
好了,你已经明白了插入排序的大体原理了。
三、接着就是循环:
1. 因为第一个元素不排(一个元素排个锤锤),所以索引自然就从1到数组长度len遍历咯
2. 好了,你已经掌握了插入排序的循环版的代码实现了
四、代码附上:
void insertSort_circulation(int *arr, int len)
{
if (len < 2)
return;
// 记录待排元素
int key;
// 索引
int j;
for (int i = 1; i < len; i++)
{
// 1. 取出待排元素
key = arr[i];
// 记录有序列中的最后一个元素的索引
j = i - 1;
// 2. 有序区域中的元素要比待排元素大 且 索引哟啊大于0 -- 将比待排元素大的元素后移
while (arr[j] > key && j >= 0)
{
// 将比待排元素大的元素后移
arr[j + 1] = arr[j];
j--;
}
// 3. 插入待排元素
arr[j + 1] = key;
}
}
void main()
{
int arr1[] = {5, 6, 2, 9, 8, 7, 3, 1, 4};
printf("排序前:\n");
printArr(arr1, sizeof(arr1) / sizeof(int));
insertSort_circulation(arr1, sizeof(arr1) / sizeof(int));
printf("排序后:\n");
printArr(arr1, sizeof(arr1) / sizeof(int));
}