C语言数组排序后无法完整显示元素的问题排查求助
问题排查与修复方案
我来帮你分析一下问题所在,主要有两个核心问题导致了你的输出异常:
1. main函数中重复调用排序函数的错误
你在输出排序后数组的循环里,每次迭代都调用了ordonnerTableau(dtab, 5),这意味着每打印一个元素前,你都会重新对数组排序一遍。这种操作不仅完全没必要,还会因为数组在多次排序过程中被反复修改,最终导致输出混乱(你看到的仅显示最后一个元素就是这个错误带来的副作用)。
正确的做法是:先调用一次排序函数完成数组排序,保存返回的数组指针,再用这个指针遍历输出。
2. 冒泡排序函数的逻辑错误
你的ordonnerTableau函数实现的冒泡排序存在两个关键问题:
- 数组越界风险:内层的
while(tab[j] > tab[j+1])没有限制j的范围,当j增长到4时,j+1=5,访问tab[5]属于数组越界,会触发未定义行为(程序可能崩溃、输出错误值等)。 - 排序逻辑错误:冒泡排序的核心是每一轮把当前未排序部分的最大元素“冒”到末尾,你的外层循环和内层while循环的组合完全不符合这个逻辑,导致排序无法正确完成。
修正后的完整代码
修正后的ordonnerTableau函数:
int * ordonnerTableau(int tab[], int taille){ int tmp; // 外层循环:控制排序的轮数,只需要循环taille-1次即可完成排序 for (int i = 0; i < taille - 1; i++){ // 内层循环:每一轮只需要比较到未排序的最后一个元素(末尾i个元素已经有序) for (int j = 0; j < taille - 1 - i; j++){ if(tab[j] > tab[j+1]){ // 交换两个元素 tmp = tab[j]; tab[j] = tab[j+1]; tab[j+1] = tmp; } } } return tab; }
修正后的main函数:
int main(int argc, char** argv) { int dtab[5] = {12, 9, 2, 1, 0}; printf("Avant :\n"); for (int k = 0; k < 5; k++) { printf("tab[%d]=%d\n",k , dtab[k]); } printf("\n"); // 仅调用一次排序函数,保存排序后的数组指针 int *sortedTab = ordonnerTableau(dtab, 5); printf("Après :\n"); for (int j = 0; j < 5; j++) { printf("tab[%d]=%d \n",j , sortedTab[j]); // 也可以用*(sortedTab + j),和sortedTab[j]等价 } return 0; // 建议添加main函数的标准返回值 }
修正后的输出
运行修正后的代码,你会得到符合预期的输出:
Avant : tab[0]=12 tab[1]=9 tab[2]=2 tab[3]=1 tab[4]=0 Après : tab[0]=0 tab[1]=1 tab[2]=2 tab[3]=9 tab[4]=12
内容的提问来源于stack exchange,提问作者Yacine TAZDAIT
相关产品推荐
相关产品推荐

