程序不返回任何东西

时间:2019-03-03 17:42:37

标签: c algorithm sorting

我写了一个c程序来对数组进行排序,但是该程序不会返回它刚刚运行的任何内容,并停留在该处,就像在等待输入一样。下面是代码

#include<stdio.h>

bool unsorted(int ar[],int x){
    int c;
    for(int i=1;i<=x;i++){
        if(ar[0]>ar[i]){
            return true;
        }
        else 
            return false;
    }
}   

void sort(int arr[],int s){

    int h,b;
    while(unsorted(arr,s)){
        h=arr[0];
        for(int i=0;i<=s;i++){
            if(arr[i]>h){
                b=arr[i];
                arr[i]=h;
                h=b;
        }
    }
     }
        for(int i=0;i<=s;i++){
            printf("%d",arr[i]);
    }
}
int main(){

    int arr[3]={ 2,1,3 };
    sort(arr,3);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

如果第一个元素不是最小元素,则函数unsorted返回true。不会检查其他两个元素是否顺序错误。这将导致错误的结果,但这不是当前问题的原因。

在排序循环中,您检查是否有任何元素大于第一个元素,然后交换它们。 这意味着升序更改为降序。 这将导致unsorted函数始终返回true,并且循环永远不会终止。

要解决它的更改条件:

void sort(int arr[],int s) {
    int h,b;
    while (unsorted(arr,s)) {
        h=arr[0];
        for (int i = 1; i < s; i++) {
            if (h > arr[i]) {
                b = arr[i];
                arr[i] = h;
                h = b;
            }
        }
    }
    for (int i=0; i < s; i++) {
            printf("%d",arr[i]);
    }
}

索引范围也是固定的。

这至少应该使您的循环终止。 如果您终止得太早,它将不会产生排序列表。

首先,您的unsorted函数需要进行一些更新:

bool unsorted(int ar[], int x) {
    int c;
    for (int i = 1; i < x; i++) {
        if (ar[i-1] > ar[i]) {
            return true;
        }
        else {
            return false;
        }
    }
}   

如果第一个元素最低,但其他元素不适合true,则这也应返回{1, 4, 3, 6}。另请注意固定索引范围。

您需要对排序部分应用类似的修复程序,以处理第一个元素之后的元素中的乱序值。