在C语言中将数组从小到大排序(不使用qsort)

4

我有一个函数,它接受一个数字数组,并将它们从小到大排序。目前,我有这个算法,但输出不是我期望的。有人能帮我解决一下吗?我不能使用任何C库函数。

/* 
   Sort "count" numbers stored in array numbers[] in non-decreasing order.
   There may be duplicate numbers in the array.
   You may use any sorting algorithm that you know.
 */

void sort( double numbers[], int count )
{
    int i, j, k;
    //printf("%d", count);

    double temp;
    do{
        j = 0;  
        for (i = 0;i<=count;i++){
                if (numbers[i] > numbers[i+1]){//this was numbers[k], which was an error
                    j = 1;
                    temp = numbers[i];
                    numbers[i] = numbers[i+1];
                    numbers[i+1] = temp;
                }
            }
    } while (j == 1);
}
5个回答

5
for循环中的条件i<=count是不正确的。
在数组中有效的索引是从0count-1。既然你在循环中访问了i+1索引处的值:
if (numbers[i] > numbers[i+1])

i的取值范围为0count-2,因此将条件更改为i<=count-2i<count-1


很高兴知道这个..但不要忘记阅读@stillstanding提供的维基链接。你的实现可以进行优化。 - codaddict

5

0

如果 (numbers[i] > numbers[k]) {

可能应该改为

如果 (numbers[i] > numbers[i+1]) {

k 没有被使用。

for (i = 0;i <= count;i++){

可能应该是

for (i = 0; i < count-1;i++){

由于只有从0到count-1的元素,然后你正在与下一个进行比较。 j的名称很糟糕。将其改为名为didSwap的布尔值。然后重新考虑您的条件,也许正好相反...


这就是为什么我提到了计数的事情 - 但是SO搞砸了文本,没有显示完整的代码... - Eiko

0

使用了变量k的值,但该变量从未被初始化或赋值。在某个时刻,你的代码将尝试访问值numbers[count],当一个包含count个元素的数组最大下标为count-1时。


0

你还没有初始化k

一旦算法移动了一个数字,它就会停止。你需要移动所有的数字。

我认为你在while循环外缺少了一个对k的for循环,但是因为我不确定你在这里想做什么,所以我不能确定。

为什么你不能实现自己的qsort()函数?那可以吗?试着在网上阅读一些排序算法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接