Не работает сортировка Qsort - C (СИ)
Формулировка задачи:
начал разбираться си и столкнулся с проблемой, не подскажите почему не работает?
//program qsort
#include<stdio.h>
#include<stdlib.h>
int swap (int *array,int i, int j)
{
int a;
a=array[i];
array[i]=array[j];
array[j]=a;
return(*array);
}
int sort(int *array ,int left,int right)
{
int e=( (left+right) /2);
int i=left;
int j=right;
do {
while ((array[i]<= array[(left+right)/2])&&(i<=e))
{
i++;
}
while ((array[j]>array[(left+right)/2])&&(j>=e))
{
j++;
}
if(i<=j)
{
swap(array,i,j);
}
} while(i<j);
if (left<j)
{
sort(array,1,j);
}
if(i<right)
{
sort(array,i,right);
}
return *array ;
}
int main()
{
int *array;
int n ;
printf("Write quantity of elements you want: ");
scanf("%d",&n);
array=(int*)malloc(sizeof( n));
for(int i=0;i<n;i++)
{
printf("Write element from number %d: ",i+1);
scanf("%d",&array[i]);
}
sort(array,0,n-1);
for(int i=0;i<n;i++)
{
printf("%d",array[i]);
}
return 0;
}Решение задачи: «Не работает сортировка Qsort»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void swap (int *arr,int i, int j)
{ int a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
void sort(int *arr ,int left, int right)
{ int e = (arr[left]+arr[right])/2; //средний опорный элемент
int i = left;
int j = right;
do
{ while (arr[i]<e) i++; //пока не найдем слева что-то большое
while (arr[j]>e) j--; //пока не найдем справа что-то маленькое
if(i<=j)
{ swap(arr,i,j); //поменяли местами
i++; j--; //двинулись дальше
}
} while(i<j);
if (left<j)
sort(arr,left,j); //продолжаем слева
if(i<right) //продолжаем справа
sort(arr,i,right);
}
int main()
{
int *arr;
arr=(int*)malloc(N*sizeof(int));
srand((unsigned int) time(NULL));
printf("Initial array:\n");
for(int i=0;i<N;i++)
{ arr[i] = rand()%100;
printf("%5d", arr[i]);
}
sort(arr,0,N-1);
printf("\n\nSorted array:\n");
for(int i=0;i<N;i++)
printf("%5d", arr[i]);
free(arr);
flushall();
getchar();
return 0;
}
Объяснение кода листинга программы
- Объединение файлов
stdio.h,stdlib.hиtime.hдля использования функций ввода-вывода, сортировки и работы со временем. - Определение константы
Nдля задания размера массива. - Создание функции
swapдля обмена значениями двух переменных. - Создание функции
sortдля сортировки массива методом двусторонней обходной сортировки. - Инициализация массива случайными значениями в функции
main. - Вызов функции
sortдля сортировки массива. - Вывод отсортированного массива в функции
main. - Освобождение памяти, выделенной под массив, с помощью функции
free. - Ожидание нажатия клавиши для завершения программы.
- Возврат значения 0 для успешного завершения программы.