我试图清除os编程的一些基本概念。我更喜欢为此做排序。 以下是我的代码:
#include<stdio.h>
#include<malloc.h>
#include <string.h>
main()
{
int array[9]={5,2,7,4,7,6,9,8,1,3};
int min,i,j,temp;
for(i=0;i<10;i++)
{
for(j=0;j<=10;j++)
{
if(array[i]<array[j])
{
temp=array[j];
array[j]=array[i];
array[i]=temp;
}
}
}
printf("\n");
for(i=0;i<10;i++)
{
printf("%d ", array[i] );
}
printf("\n");
}
输出是:
1 2 4 5 6 7 7 8 9 9
这是出乎意料的。一定是
1 2 3 4 5 6 7 7 8 9
有人可以帮助我知道为什么这个奇怪的行为在数组的末尾。为什么重复“9”以及“3”丢失的位置? 此外,我很感激,如果有人告诉我最佳排序的名称(主要是我听说过泡泡和快速排序,但为什么和我不知道的区别是什么)。 请不要告诉我有关内置函数(如qsort()等)的信息,因为目标是清除概念 您可以使用任何语言来解释c / c ++ /甚至算法。感谢
答案 0 :(得分:4)
for(j=0;j<=10;j++)
将为您提供未定义的行为,因为您正在使用随后的array[j]
访问数组范围之外。
int array[9]={5,2,7,4,7,6,9,8,1,3};
也不平衡,您需要int array[10]
,因为初始化列表中有10个元素。更好的是,让编译器为您完成工作并编写int array[]
。这就是输出中当前省略了3
的原因(尽管存在未定义的行为)。
答案 1 :(得分:2)
array[9]
; i < 10
; j <= 10
。数组索引超出范围。未定义的行为。
i
和j
一样检查 i < 9
和j < 9
int array[9]={5,2,7,4,7,6,9,8,1,3};
你在那个数组中有 10 元素。
答案 2 :(得分:1)
指定一个包含9个元素的数组,但初始化器和外部循环中有10个元素:
int array[9]={5,2,7,4,7,6,9,8,1,3};
// ^- this is not the last index, but the number of elements!
for(i=0;i<10;i++)
在这里你迭代到索引10,这是第11个元素(索引0是第一个):
for(j=0;j<=10;j++)
//^- when j is 10 this is still true, but there is no array[10]
要修复,请更改为以下内容:
int array[] = {5,2,7,4,7,6,9,8,1,3};
// ^- leave empty and let the compiler count the elements
const int array_len = sizeof(array) / sizeof(*array);
// length: ^- whole array / ^- one element
for (i = 0; i < array_len; ++i) {
for (j = 0; j < array_len; ++j) {
答案 3 :(得分:0)
首先,应使用代码按钮添加任何代码,以使其格式正确且易于阅读。
其次,你的阵列太小了。它的大小是9,但你有10个项目。