排序为最后位置的元素提供错误的输出

时间:2014-02-28 12:31:45

标签: c++ c sorting quicksort bubble-sort

我试图清除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 ++ /甚至算法。感谢

4 个答案:

答案 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。数组索引超出范围。未定义的行为。

应该像ij

一样检查

i < 9j < 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个项目。