递归实现冒泡排序时出现Segmentation Error问题求助
递归冒泡排序段错误问题分析与修复
问题根源
你的代码出现段错误是因为无限递归导致栈溢出,具体原因有两点:
- 循环范围错误:
for (int i = 0; i < ARR_SIZE - 2; i++)中,ARR_SIZE - 2让循环只处理到索引7(i最大为7),索引9的元素从未参与比较,导致部分元素始终无法归位,swap_counter一直不为0,递归永远无法终止。 - 递归未缩小排序范围:每次递归都从头处理整个数组,没有把已经排好的末尾元素排除在外,进一步加剧了无限递归的问题。
修复后的代码
#include <stdio.h> #define ARR_SIZE 10 // 修改函数参数,增加当前需要排序的长度 void bubble_sort(int array[], int length); int main(void) { int array[] = {4,2,9,3,2,4,9,10,20,4}; // 初始传入数组总长度 bubble_sort(array, ARR_SIZE); for (int i = 0; i < ARR_SIZE ; i++) { printf("%d\n", array[i]); } } void bubble_sort(int array[], int length) { if (length <= 1) { // 只剩一个元素,无需排序,直接返回 return; } int swap_counter = 0; // 循环范围改为 length - 1,确保能比较到当前未排序部分的最后一对元素 for (int i = 0; i < length - 1; i++) { if (array[i] > array[i + 1]) { swap_counter++; int temp = array[i]; array[i] = array[i + 1]; array[i + 1] = temp; } } if (swap_counter != 0) { // 递归处理前 length-1 个元素(最后一个已排好) bubble_sort(array, length - 1); } }
关键修改点
- 给
bubble_sort增加length参数,用于指定当前需要排序的数组长度,每次递归时长度减1,排除已经排好的末尾元素。 - 循环条件改为
i < length - 1,确保能遍历到当前未排序部分的所有相邻元素对。 - 增加递归终止条件:当
length <= 1时直接返回,避免不必要的递归。 - 把
array[i] >= array[i + 1]改为array[i] > array[i + 1],避免相等元素无意义的交换,提升效率。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

