Я новичок в C, и я пытался закодировать программу Quicksort, которая может принимать случайно сгенерированный массив действительных чисел и его размер в качестве аргумента, а затем сортирует элементы в порядке возрастания. Не могу сообразить, что прописать в поле размера массива при первом рекурсивном вызове функции QuickSort, которая предназначена для представления подмассива A[0...q-1]. Насколько я могу судить, остальная часть кода в порядке, потому что при подключении к программе-драйверу, которая генерирует случайные числа, программа возвращает элементы, хотя и в неправильном порядке. Я ценю любую помощь/предложения.
int Partition(float *,int);
int QuickSort(float *A,int n)
{
int q;
if(n>1){
q = Partition(A,n);
QuickSort(&A[],q); //Trying to figure out what to put in here.
QuickSort(&A[q+1],(n-1)-q); //This recursion sends the subarray A[q+1...n-1] to QuickSort, I think it works fine.
}
}
int Partition(float *A,int n){
int i,j;
float x;
x = A[n-1];
i=0;
for(j=0;j<=n-2;j++){
if(A[j] <= x){
A[i]=A[j];
i = i+1;
}
}
A[i]=A[n-1];
return i;
}
Partition()
при входе и при выходе. И если вы сделаете это, вы обнаружите, что ваш код разбиения полностью портит ваш массив — содержимое до и после не совпадает. Например, я получилP1 (5): [0] = 0.197551 [1] = 0.277775 [2] = 0.277775 [3] = 0.277775 [4] = 0.197551
——P2 (5): [0] = 0.197551 [1] = 0.197551 [2] = 0.277775 [3] = 0.277775 [4] = 0.197551
, где значение нижнего индекса[1]
изменилось с 0,277775 до 0,197551. Вам нужно менять местами элементы, а не просто перемещать их. - person Jonathan Leffler   schedule 24.10.2016