Метод "быстрой сортировки" массива - 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
в этот момент будет содержать индекс элемента, который необходимо поместить в начало массива для правильной сортировки. - После завершения цикла выполняются дополнительные действия, которые не указаны в предоставленном коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д