Программа на C ничего не возвращает

#c #algorithm #sorting

#c #алгоритм #сортировка

Вопрос:

Я написал программу на 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. примечание сбоку: тег редактируется c , а не c

2. Вы выходите за границы массива с помощью циклов, подобных for(int i=0; i<=s; i ) которые должны быть for(int i=0; i<s; i ) .

3. if(ar[0]>ar[i]) было ли это задумано if(ar[i-1]>ar[i]) вместо этого?

4. Вам следует начать использовать отладчик. Он может показать вам ход выполнения в вашей программе, и вы можете сравнить фактические значения переменных с вашими ожидаемыми значениями. Возможно, вы обнаружите, что ваша функция unsorted и for цикл в sort на самом деле не выровнены по тому, что означает «отсортировано».

5. нет, эта функция предназначена только для проверки, отсортирован ли массив.

Ответ №1:

Ваша функция unsorted возвращает true , если первый элемент не самый маленький. Не проверяется, расположены ли какие-либо другие 2 элемента в неправильном порядке. Это приведет к неправильным результатам, но не является причиной текущей проблемы.

В вашем цикле сортировки вы проверяете, не больше ли какого-либо элемента, чем первый, а затем меняете их местами. Это означает, что порядок возрастания изменен на убывающий. Это приведет к тому, что 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;
        }
    }
    return false;
}   
  

Это также должно возвращать, true если первый элемент является наименьшим, но другие не подходят, как {1, 4, 3, 6} . Также обратите внимание на фиксированный диапазон индексов.

Вам нужно применить аналогичное исправление к части сортировки, чтобы обрабатывать неупорядоченные значения в элементах после первого.