Метод "быстрой сортировки" массива - C (СИ)
Формулировка задачи:
Здравствуйте, помогите разобраться с проблемой. Общее задание звучит так: написать программу, которая будет загружать массив из файла, сортировать его с помощью метода быстрой сортировки и записывать итоговый массив в файл. Я нашел метод, разобрался с ним, написал программу, начал тестировать, и как оказалось, есть ошибка, которую я не могу найти.
Ошибка состоит в том, что при размере массива 3 или 6, массив сортируется, но как бы смещается на одно значение вперед, а с остальными размерностями сортировка работает правильно.
Вот пример:
Массив:
1 6 4 3 2 8
Получается массив:
0 1 2 3 4 6
Вот мой код:
Файл должен быть вида:
размерность
1-эл 2-эл ... n-эл
Пример:
6
1 6 4 3 2 8
Помогите пожалуйста найти и исправить ошибку, просто я уже все перепробовал и ничего не получается
void quickSort(int * a, int N)
{ long i = 0, j = N;
int temp, p;
p = a[ N/2 ];
do
{
while ( a[i] < p ) i++;
while ( a[j] > p ) j--;
if (i <= j)
{
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j--;
}
} while ( i<=j );
if ( j > 0 ) quickSort(a, j);
if ( N > i ) quickSort(a+i, N-i);
}
main()
{
int a[10];
FILE *f;
char path[256];
int i,n;
printf("Введите путь к файлу с исходными данными: ");
gets(path);
f=fopen(path,"r");
fscanf(f,"%d",&n);
for (i=0;i<n;i++)
fscanf(f,"%d",&a[i]);
fclose(f);
printf("Размер массива: %d",n);
printf("\nМассив A:\n");
for (i=0;i<n;i++)
printf("%d ",a[i]);
quickSort(a, n);
printf("\nОтсортированный массив A:\n");
for (i=0;i<n;i++)
printf("%d ",a[i]);
printf("\nВведите путь для записи результата: ");
gets(path);
f=fopen(path,"w");
fprintf(f,"Полученный отсортированный массив А:\n");
for (i=0;i<n;i++)
fprintf(f,"%d ",a[i]);
fclose(f);
}Решение задачи: «Метод "быстрой сортировки" массива»
textual
Листинг программы
while ( a[j] > p ) j--;
Объяснение кода листинга программы
- Начинается цикл while, условием которого является выражение
a[j] > p. - В каждой итерации цикла значение переменной
jуменьшается на единицу. - Оператор
--используется для уменьшения значения переменнойjна единицу. - Цикл выполняется до тех пор, пока значение переменной
a[j]больше значения переменнойp. - Когда условие становится ложным, цикл завершается.
- Значение переменной
jв этот момент будет содержать индекс элемента, который необходимо поместить в начало массива для правильной сортировки. - После завершения цикла выполняются дополнительные действия, которые не указаны в предоставленном коде.