2016-10-08 3 views
-3

https://phoxis.org/2012/07/12/get-sorted-index-orderting-of-an-array/Почему мой метод сортировки в qsort меняет мой массив?

Я попробовал метод здесь в разделе

Использование QSort в C

для сортировки массива и возвращает индексы, изменяя base_arr массив быть типа двойной *. Однако, когда я печатаю arr [idx [i]] на экране, половина значений была изменена на 0 и была отсортирована так, как если бы они всегда были 0. Что могло бы случиться так?

double *BASE_ARR; 
int main(int argc, char *argv[]) { 

int N = par->N; 
int K = par->K; 
double *ptr; 
ptr = (double *) malloc(N*sizeof(ptr)); 

int *idx; 
idx = (int *) malloc(N*sizeof(idx)); 

// generate the array to be sorted (ptr), in a separate file 

for (int i = 0; i < N; i++) { 
    idx[i] = i; 
} 

BASE_ARR = ptr; 
// sort 
qsort(idx, N, sizeof(idx), idxSort); 


for (int i = 0; i < N; i++) { 
    printf("%f\n",ptr[idx[i]]); 
} 
for (int i = 0; i < N; i++) { 
    printf("%d\n",idx[i]); 
} 

for (int i = 0; i < K; i++) { 
    idx[i] = -1; 
} 


return 0; 
} 

static int idxSort (const void *a, const void *b) { 
int aa = *((int *)a), bb = *((int *)b); 

if (BASE_ARR[aa] < BASE_ARR[bb]) { 
    return -1; 
} 
if (BASE_ARR[aa] == BASE_ARR[bb]) { 
    printf("what");tack 
    return 0; 
} 
if (BASE_ARR[aa] > BASE_ARR[bb]) { 
    return 1; 
} 

} 
+4

Пожалуйста, отредактируйте ваше сообщение и включите исходный код. Благодарю. –

+1

Вы malloc неправильное пространство. выражение 'sizeof' должно измерять размер того, на что вы указываете, а не размер указателя –

ответ

2
qsort(idx, N, sizeof(idx), idxSort); 

должен быть

qsort(idx, N, sizeof(*idx), idxSort); 

idx является указателем. qsort не нужно знать размер poiner, в котором нужно знать размер элемента массива.

То же самое касается ваших звонков malloc. Вам нужно использовать sizeof(*idx) и sizeof(*ptr). Кстати, не делайте результат malloc.

Смежные вопросы