2012-01-03 6 views
1

Я написал обычный код сортировки массива слияния, и все, что я хочу сделать, это позвонить на эту функцию с помощью «asize», а не с номером, но вместо получения [1 2 3 4 5 6 7 8 9 10] обычный отсортированный массив я получаю [1 2 -858993460 3 4 5 6 7 8 9]неправильный результат сортировки слиянием

, пожалуйста, помогите мне найти причину этого

void merge_sort(int *a,int first, int last) 
{ 
    int middle; 
      if(first < last) 
      { 
       middle=(first+last)/2; 
       merge_sort(a,first,middle); 
       merge_sort(a,middle+1,last); 
       merge(a,first,middle,last); 
      } 
} 






void main() 
{ 

    int a[] = {9, 7, 2, 3, 5, 4, 1, 8, 6, 10}; 
    int asize= (sizeof a/sizeof a[0]); 
    merge_sort(a, 0, asize); 
For (i = 0; i < 10; i++) 
     printf ("%d ", a[i]); 

ответ

5

Поскольку ваш результирующий массив имеет одну странную ценность и одно отсутствующее значение, скорее всего, случай ошибки вне по одному, вероятно, проходя asize как индекс последнего элемента, а не asize - 1.

Параметры, необходимые для сортировки слияния, - это первый и последний индексы (с нулевой основанием), поэтому для массива размера 10 это будет 0 и 9. Вы передаете 0 и 10 с вашим текущим кодом.

Из-за этого, вы на самом деле сортировки "массив":

{9, 7, 2, 3, 5, 4, 1, 8, 6, 10, ?} 
\___________________________/ | 
      your array   +-- not your array 

и, поскольку ? является -858993460 (в данном случае), вы в конечном итоге с:

{-858993460, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 
\___________________________________/ \/ not your 
       your array     \ array 

Затем печать первых десяти элементов дает вам результат, который вы видите. К сожалению, любая переменная (или информация управления стеком или что-либо действительно), которая держала это большое отрицательное значение, теперь была перезаписана значением 10, а не тем, что вы действительно хотите.

Что вы делаете, это неопределенное поведение. Немедленно остановите его. Не заставляй меня прийти туда :-)

Простое исправление, кстати, является изменение:

merge_sort (a, 0, asize); 

в:

merge_sort (a, 0, asize - 1); 
2

Вы шагового над конец массива в мусор. last должно быть asize-1, то есть звонить merge_sort(a, 0, asize-1);.

2
merge_sort(a, 0, asize); 

Вы должны отправить asize-1 т.е. от 0 до asize-1 элементов. Правильно!

merge_sort(a, 0, asize-1); 
+0

пожалуйста, вы можете explian почему? – Alexxx

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