#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}
. Также обратите внимание на фиксированный диапазон индексов.
Вам нужно применить аналогичное исправление к части сортировки, чтобы обрабатывать неупорядоченные значения в элементах после первого.