我試圖使用數組裏用C實現歸併排序,這裏是我的代碼:合併排序實現不起作用
#include <stdio.h>
#include <stdlib.h>
void merge(int s[], int low, int middle, int high)
{
int i,l=0,r=0;
int left[high/2], right[high/2];
for(i = low; i<=middle; i++) left[i-low] = s[i];
for(i = middle+1; i<=high; i++) right[i-middle-1] = s[i];
i = low;
while(l <= middle-low || r <= high - middle - 1)
{
if(left[l] <= right[r])
{
s[i++] = left[l];
l++;
}
else
{
s[i++] = right[r];
r++;
}
}
while(l <= middle-low)
{
s[i++] = left[l];
l++;
}
while(r <= high - middle - 1)
{
s[i++] = left[r];
r++;
}
}
void mergesort(int s[], int low, int high)
{
int i;
int middle;
if(low < high){
middle = (low + high)/2;
mergesort(s, low, middle);
mergesort(s, middle+1, high);
merge(s, low, middle, high);
}
}
int main()
{
int nums[] = {5, 345, 1, 120, 40, 3450};
int size = (sizeof(nums))/(sizeof(int));
int i;
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
mergesort(nums, 0, size);
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
return 0;
}
輸出:
5 345 1 120 40 3450
0 1 4 5 40 120
這是一種接近。有人能指出我的錯誤嗎?謝謝。
你的合併函數對'for'循環有可疑的上限,'<='肯定是錯誤的。 –
乍一看:你的上面的數組邊界是獨佔的,就像C中通常的那樣。這意味着所有'<='作爲循環條件應該可能只是'<'。當「高」是奇數時,你的右邊的子陣列也是一個元素。 –
將所有<=變爲<打破代碼。現在它打印出什麼似乎是隨機指針值,還有一個分段錯誤,我不能用gdb跟蹤。 – Antoni4040