Сортировки выдают неверный результат - C (СИ)
Формулировка задачи:
Помогите, пожалуйста.
Написала три вида сортировки: подсчетом, методом вставок, обменом (пузырьком). Они работают, но результат выдают неправильный. Может я где-то ошиблась? Помогите, пожалуйста.
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void count (int X[])
{
int Y[SIZE], i, j;
for (i = 0; i < SIZE; i++)
{
j = i;
while (j > 0 && Y[j-1] > X[i])
{
Y[j] = Y[j-1];
j = j - 1;
}
Y[j] = X[i];
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", X[i]);
}
void insert (int X[])
{
int i, j, k;
for (i=1; i<SIZE; i++)
{
k=X[i] ; // запоминание элемента для вставки
for (j=i-1; j>=0 && k<X[j] ; j--) // ищем место для вставки
X[j+1] =X[j] ; // сдвиг на одну позицию
X[j+1] =k;
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", X[i]);
}
void exchange (int X[])
{
int i, j, n;
for(i=0; i<SIZE-1; i++)
for (j=SIZE-2; j>=i; j--)
if (X[j]>X[j+1])
{
n=X[j];
X[j]=X[j+1];
X[j+1] = n;
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", X[i]);
}
int main()
{
int S[SIZE], a, i;
for (i=0; i<SIZE; i++)
{
printf ("S[%d]=", i+1);
scanf ("%d", &S[i]);
}
while(a!=0)
{
printf ("Input number of menu: \n 1. Sorting by counting; \n 2. Simple method inserts; \n 3. Exchange sorting; \n 4. Exit\n");
scanf ("%d", &a);
if(a==1) count(S[SIZE]);
if(a==2) insert(S[SIZE]);
if(a==3) exchange(S[SIZE]);
if(a==4) break;
else printf ("Wrong number of menu\n");
}
system("PAUSE");
return 0;
}Решение задачи: «Сортировки выдают неверный результат»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void count (int X[])
{
int Y[SIZE], i, j;
for (i = 0; i < SIZE; i++)
{
j = i;
while (j > 0 && Y[j-1] > X[i])
{
Y[j] = Y[j-1];
j = j - 1;
}
Y[j] = X[i];
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", Y[i]);
}
void insert (int X[])
{
int i, j, k;
for (i=1; i<SIZE; i++)
{
k=X[i] ; // запоминание элемента для вставки
for (j=i-1; j>=0 && k<X[j] ; j--) // ищем место для вставки
X[j+1] =X[j] ; // сдвиг на одну позицию
X[j+1] =k;
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", X[i]);
}
void exchange (int X[])
{
int i, j, n;
for(i=0; i<SIZE-1; i++)
for (j=SIZE-2; j>=i; j--)
if (X[j]>X[j+1])
{
n=X[j];
X[j]=X[j+1];
X[j+1] = n;
}
printf("\n Sorted massive: \n");
for(i=0; i<SIZE; i++)
printf("%d\t", X[i]);
}
int main()
{
int S[SIZE], a, i;
for (i=0; i<SIZE; i++)
{
printf ("S[%d]=", i);
scanf ("%d", &S[i]);
}
a = -1;
while(a!=0)
{
printf ("\nInput number of menu: \n 1. Sorting by counting; \n 2. Simple method inserts; \n 3. Exchange sorting; \n 4. Exit\n");
scanf ("%d", &a);
if(a==1) count(S);
else if(a==2) insert(S);
else if(a==3) exchange(S);
else if(a==4) return 0;
else printf ("Wrong number of menu\n");
}
//system("PAUSE");
return 0;
}
Объяснение кода листинга программы
Код представляет собой сортировку массива методом подсчёта (count), вставки (insert) и обмена (exchange). В функции main() пользователь выбирает метод сортировки, вводя число с клавиатуры. Список элементов кода:
- В функции main() используется цикл while(a!=-1), который выполняется до тех пор, пока пользователь не введёт 4, что соответствует выходу из программы.
- В каждой итерации цикла пользователь выбирает метод сортировки, вводя число с клавиатуры.
- Если пользователь ввёл 1, вызывается функция count(), которая сортирует массив методом подсчёта.
- Если пользователь ввёл 2, вызывается функция insert(), которая сортирует массив методом вставки.
- Если пользователь ввёл 3, вызывается функция exchange(), которая сортирует массив методом обмена.
- Если пользователь ввёл 4, выполняется выход из программы.
- Если пользователь ввёл неправильное число, выводится сообщение об ошибке.
- В функции count() используется алгоритм сортировки подсчётом, который не требует дополнительных переменных.
- В функции insert() используется алгоритм сортировки вставки, который использует дополнительную переменную k для хранения элемента для вставки.
- В функции exchange() используется алгоритм сортировки обмена, который использует дополнительную переменную n для хранения элемента для обмена.