C 运行气泡排序后出现运行时错误
我试图编写一个对数组进行冒泡排序的程序,但每次运行该程序时,都会弹出一个错误:C 运行气泡排序后出现运行时错误,c,arrays,runtime-error,bubble-sort,C,Arrays,Runtime Error,Bubble Sort,我试图编写一个对数组进行冒泡排序的程序,但每次运行该程序时,都会弹出一个错误:运行时错误:索引4超出“int[e]”类型的界限。 这里的问题是什么 int main(void) { printf("How many elements are there in the array?: "); int e = get_int(); int array[e]; for (int i = 0; i < e; i++) { printf("Inse
运行时错误:索引4超出“int[e]”类型的界限。
这里的问题是什么
int main(void) {
printf("How many elements are there in the array?: ");
int e = get_int();
int array[e];
for (int i = 0; i < e; i++) {
printf("Insert element #%i: ", i + 1);
array[i] = get_int();
}
for (int i = 0; i < e - 1; e++) {
for (int j = 0; j < e - i - 1; j++) {
if (array[j] > array[j + 1]) {
int swap = array[j];
array[j] = array[j + 1];
array[j + 1] = swap;
}
}
}
printf("\n");
}
int main(无效){
printf(“数组中有多少个元素?:”;
int e=get_int();
int数组[e];
for(int i=0;i数组[j+1]){
int swap=数组[j];
数组[j]=数组[j+1];
数组[j+1]=交换;
}
}
}
printf(“\n”);
}
您为循环增量部分键入了,(int i=0;i应该是:
for (int i = 0; i < e - 1; i++)
for(inti=0;i
以下是更正的版本:
#include <stdio.h>
int main(void) {
printf("How many elements are there in the array?: ");
int e = get_int();
for (int i = 0; i < e; i++) {
printf("Insert element #%i: ", i + 1);
array[i] = get_int();
}
for (int i = 0; i < e - 1; i++) {
for (int j = 0; j < e - i - 1; j++) {
if (array[j] > array[j + 1]) {
int swap = array[j];
array[j] = array[j + 1];
array[j + 1] = swap;
}
}
}
printf("{ ");
for (int i = 0; i < e; i++) {
printf("%d, ", array[i]);
}
printf("}\n");
return 0;
}
#包括
内部主(空){
printf(“数组中有多少个元素?:”;
int e=get_int();
for(int i=0;i数组[j+1]){
int swap=数组[j];
数组[j]=数组[j+1];
数组[j+1]=交换;
}
}
}
printf(“{”);
for(int i=0;i
除了chqrlie指出的错误之外,不要使冒泡排序过于复杂(而且它有缺陷,只考虑连续索引)。写得很简单(注意,内部循环经过优化,以避免两次处理“下三角”项):
for(int i=0;i数组[i]){
int swap=数组[j];
数组[j]=数组[i];
数组[i]=交换;
}
}
}
真的吗?您发现该错误消息令人困惑吗?请显示您迄今为止的研究/调试工作。请先阅读第页。请阅读如何产生一个-你需要提供所有的输入和预期的输出太!看起来像在i==0
,'if(array[j]>array[j+1])`,最后一次迭代会导致问题……用笔和纸检查。您的运行时非常好。其他人会说“运行时错误,代码0x232532464-见鬼去吧”…@Jean Françoisfare:我想我会用n
而不是e
。我修复了for循环,但程序的输出搞乱了。如果数组是{5,4,3,2,1},它将输出4,2,3,4。为什么?@chqrlie现在去,值得你的10次重复:)@AshleyMoe你的循环搞乱了。使用i和j,然后上升到n。对于内部循环,从i+1开始,使用两个索引,而不是愚蠢的索引+1@AshleyMoe:您一定输入了错误的修复或输出循环,我得到了正确的结果。@Jean-FrançoisFabre:您也应该得到您的结果,但是上面的代码实现了一种稍微不同的排序算法:选择和冒泡排序的混合。气泡排序仅交换相邻元素。Ashley的版本将元素气泡化到数组的末尾,她也不处理较低的三角形,只是处理一个不同的三角形。请参阅@chqrlie good know(现在我明白了为什么操作代码如此复杂)。我知道我再也不会发明比研究人员已经或将要做的更好的排序了,所以我尽量保持简单:气泡排序或调用一些库:)@Jean-FrançoisFabre:重新实现和调整排序算法是一个非常有趣和令人谦卑的经历。早餐尝试qsort
或radixsort;-)
for (int i = 0; i < e; i++) {
for (int j = i+1; j < e; j++) {
if (array[j] > array[i]) {
int swap = array[j];
array[j] = array[i];
array[i] = swap;
}
}
}