2013-11-10 3 views
0

Мне дана программа на C, которая реализует Quicksort на массивах со значениями int. Мне нужно преобразовать его в программу, которая будет реализовывать Quicksort на массивах с двойными значениями *. Я думал, что мне просто нужно изменить объявления «int» на «double *», но по какой-то причине программа больше не работает, когда я тестирую массивы с другими значениями, чем целые.Quicksort with double * values ​​

Может кто-нибудь помочь? Я действительно почти ничего не знаю о программировании на C и не знаю, как это сделать. Вот программа «ИНТ»:

void quicksort(int a[], int n) 
{ 
    if (n <= 1) return; 
    int p = a[n/2]; 
    int b[n], c[n]; 
    int i, j = 0, k = 0; 
    for (i=0; i < n; i++) { 
     if (i == n/2) continue; 
     if (a[i] <= p) b[j++] = a[i]; 
     else   c[k++] = a[i]; 
    } 
    quicksort(b,j); 
    quicksort(c,k); 
    for (i=0; i<j; i++) a[i] =b[i]; 
    a[j] = p; 
    for (i= 0; i<k; i++) a[j+1+i] =c[i]; 
} 


int main(void) { 
    int i; 
    /* das Array zum Sortieren */ 
    int test_array[] = { 5, 2, 7, 9, 6, 4, 3, 8, 1 }; 
    int N = sizeof(test_array)/sizeof(int); 

    quicksort(test_array, N); 

    for(i = 0; i < N; i++) 
     printf("%d ", test_array[i]); 
    printf("\n"); 

    return 0; 
} 
+4

Если не домашнее задание, просто используйте 'QSort()' от STDLIB. –

+0

Это домашнее задание. –

+1

И если это домашнее задание, ваш быстрый алгоритм сортировки * более сложный, чем он должен быть. Но я рекомендую вам использовать один массив и длину для параметров. Большинство начинающих реализаций даже не делают этого правильно (ваш все еще выключен, но усилия были там, по крайней мере). Fyi, вам не нужно 'b []' или 'c []' делать это вообще. – WhozCraig

ответ

2

При замене int с с double указателями, вам необходимо изменить сравнение - для сравнения заостренного до значений, а не сами указателей.

+0

Я знаю, что должен звучать ужасно неосведомленно, но я не знаю, что означают «указатели» и «заостренные» в этом контексте. –

+0

Я знаю, что должен звучать ужасно невежественно, но я не знаю, что означают «указатели» и «заостренные» в этом контексте. Нужно ли мне помещать звездочки? –

+1

@Balerion_the_black перечитайте свой вопрос и уточните его. Вы сортируете массив 'double' или массив' double * '. Существует * мир * разницы. – WhozCraig

0
void quicksort(double a[], int n) { 
    if (n <= 1) return; 
    double p = a[n/2]; 
    double b[n], c[n]; 
    int i, j = 0, k = 0; 
    for (i=0; i < n; i++) { 
     if (i == n/2) continue; 
     if (a[i] <= p) b[j++] = a[i]; 
     else   c[k++] = a[i]; 
    } 
    quicksort(b,j); 
    quicksort(c,k); 
    for (i=0; i<j; i++) a[i] =b[i]; 
    a[j] = p; 
    for (i= 0; i<k; i++) a[j+1+i] =c[i]; } 


int main(void) { 
    int i; 
    /* das Array zum Sortieren */ 
    double test_array[] = { 5.1, 2.0, 7.8, 9.5, 6.0, 4.7, 3.6, 8.7, 1.1 }; 
    int N = sizeof(test_array)/sizeof(double); 

    for(i = 0; i < N; i++) 
     printf("%f ", test_array[i]); 
    printf("\n"); 


    quicksort(test_array, N); 

    for(i = 0; i < N; i++) 
     printf("%f ", test_array[i]); 
    printf("\n"); 

    return 0; } 

Отлично работает, только что сменил номер, чтобы удвоить. Если вы хотите научиться кодировать на C, вам лучше получить книгу GOOD. Указатели являются базовыми знаниями в C/C++ !! Проверить это для лучшего Infos на быстрой сортировки: http://de.wikipedia.org/wiki/Quicksort

MFG