C编程:创建10个元素数组,Bubblesort算法,返回数组的最小值和最大值

时间:2018-05-18 04:19:53

标签: c arrays sorting for-loop bubble-sort

所以实际问题只是要求接受一个10元素数组并返回最小值和最大值。我习惯于在Matlab / GNUoctave中处理数组,但今天是我第一次在C中弄乱它们。

无论如何,我想我想知道的是,是否有更好的方式输入数组而不是像我一样使用for循环。

另外,我无法弄清楚如何阻止我的bubblesort阻止循环直到数组被排序。我尝试了“while(;;)”没有成功,并开始研究布尔变量,但没有找到我想要的东西。

另外,如果有一个更好的方法来完成这个,我在这里学习。就像,对于这种情况,bubblesort是愚蠢的,我不知道。我怀疑是的。更长的阵列可能需要很长时间?

#include <stdio.h>


int main()
{
    int a[10];
    int i;
    int k;
    int temp;   


    for (i=0; i < 10; i++)
    {
        printf("Enter an integer: ");
        scanf("%d",&a[i]);
    }

    for (i=0; i < 10; i++)
    {
        if (a[i] > a[i+1])
        {
            temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
    printf("Smallest = %i\nLargest = %i\n",a[0],a[9]);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我看到你的代码(a)

的两个直接问题

首先,冒泡排序通常需要多次传递才能对整个集合进行排序。每次传递都会将单个项目“冒泡”到正确的位置。

第二个问题是,当您比较项目nn + 1时,n最好不要超过八元素数组中的八个。

考虑到这两件事,最简单的(不一定是最有效的)冒泡排序将是:

for (int pass = 1; pass <= 10; ++pass) {
    for (int idx = 0; idx < 9; ++idx) {
        if (a[idx] > a[idx + 1]) {
            int temp = a[idx];
            a[idx] = a[idx + 1];
            a[idx + 1] = temp;
        }
    }
}

在完成排序的传球之后退出(不管是什么,而不是十次传球)会使用一个标志来表示:

int madeSwap = 1; // or bool madeSwap (after #include <stdbool.h>).
while (madeSwap) {
    madeSwap = 0; // false for stdbool
    for (int idx = 0; idx < 9; ++idx) {
        if (a[idx] > a[idx + 1]) {
            int temp = a[idx];
            a[idx] = a[idx + 1];
            a[idx + 1] = temp;
            madeSwap = 1; // true for stdbool
        }
    }
}

当然,只有当你需要对数组进行排序时才重要。你的问题标题似乎表明这一点,但身体没有。

因此,如果唯一的要求是返回最小值和最大值,则不需要排序。你可以这样做:

int minVal = a[0], maxVal = a[0];
for (int idx = 1; idx < 10; ++idx) {
    if (a[idx] < minVal) minVal = a[idx];
    if (a[idx] > maxVal) maxVal = a[idx];
}
// minVal and maxVal now hold the minimum and maximum value respectively.

(a)实际上有一个第三个​​问题,如果你输入不是 {{{ 1}}。如果发生这种情况,则不会设置该值,并且输入流将保持在尝试读取之前的状态。使用int通常总是检查返回代码,例如:

scanf

我保持这一点,因为虽然拥有健壮的代码更好,但通常认为教育代码不需要。但是,你最好早点养成这个习惯。

答案 1 :(得分:0)

冒泡排序的时间复杂度为O(n^2),此任务不是必需的。你的冒泡排序的实现也是错误的。您将需要一个运行for loop次的外部10(或者在没有交换任何元素时终止)。 我将为您的问题概述一个更简单的方法

smallest = INF  //very large value
largest = -INF  //very small value
for (i=0; i < 10; i++) {
    smallest  = min(smallest, a[i])
    largest = max(largest, a[i])
}