嵌套for循环实现的插入排序结果异常,请求排查错误原因
插入排序实现问题分析与修正
你的代码核心问题出在内层循环的终止逻辑上:
- 原代码的内层for循环会从
j = i-1一直遍历到j = -1,无论当前arr[j]是否大于key。哪怕遇到比key小或相等的元素,循环仍会继续执行,导致所有前面的元素都被向后移动一位,最终key被强制放到数组的起始位置,完全违背了插入排序“找到合适位置插入”的逻辑。
插入排序的正确逻辑是:遍历已排序区间的元素,只要当前元素大于key,就将其向后移动;一旦遇到不大于key的元素,就停止遍历——此时的位置就是key应该插入的地方。
修正后的代码
#include <stdio.h> int main() { int i, j; int arr[] = {32, 5, 45, 8, 17, 82, 10}; int size = sizeof(arr) / sizeof(arr[0]); printf("Before Sorting: "); for (i = 0; i < size; i++) { printf("%d ", arr[i]); } for (i = 1; i < size; i++) { int key = arr[i]; // 将arr[j] > key加入循环条件,遇到不大于key的元素立即终止循环 for (j = i - 1; j >= 0 && arr[j] > key; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = key; } printf("\nAfter Sorting: "); for (i = 0; i < size; i++) { printf("%d ", arr[i]); } return 0; }
修正说明
把arr[j] > key的判断从循环体的if语句,移到for循环的条件中。这样当arr[j] <= key时,循环会立刻停止,此时j的位置指向最后一个大于key的元素的前一位(如果j=-1则说明所有已排序元素都大于key),最后将key插入到j+1的位置,就能得到正确的排序结果。
内容的提问来源于stack exchange,提问作者Nagarjun
相关产品推荐
相关产品推荐

