[問題] merge sort

作者: wavek (狗貓貓 m(OvO)m)   2018-10-22 23:34:42
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
code::block
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
不清楚XD
問題(Question):
先抱歉程式有點冗長不好看,非資工系,最近開始看資結寫C
寫merge sort,跑出來結果與預期不同
不確定是邏輯與觀念錯誤,還是code寫法的問題
餵入的資料(Input):
int numbers[SIZE]={4,15,16,50,8,43,42,108};
預期的正確結果(Expected Output):
{4,8,15,16,42,43,50,108}
錯誤結果(Wrong Output):
{4,15,16,50,8,43,42,108} 跟輸入一樣沒變
i,j,k那邊改成
int i=0;
int j=0;
int k=0;
又會跑出不同的結果
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8
int merge(int L[],int R[],int A[]){
int i=0;
int j=0;
int k=0;
while( i<sizeof(L)/sizeof(L[0]) && j<sizeof(R)/sizeof(R[0])){
if(L[i] <= R[j]){
A[k] = L[i];
i++;
}
else{
A[k] = R[j];
j++;
}
k++;
}
while(i<sizeof(L)/sizeof(L[0])){
A[k]=L[i];
i++;
k++;
}
while(j<sizeof(R)/sizeof(R[0])){
A[k]=R[j];
j++;
k++;
}
}
int merge_sort(int array[],int n){
if (n < 2){
return;
}
int mid = n/2;
int left[mid];
int right[n-mid];
for (int i = 0; i < mid-1; i++){
left[i] = array[i];
}
for (int i = mid; i < n-1; i++){
right[i-mid] = array[i];
}
merge_sort(left,mid);
merge_sort(right,n-mid);
merge(left,right,array);
}
int main(void)
{
int numbers[SIZE]={4,15,16,50,8,43,42,108};
printf("\n");
for (int i = 0; i < SIZE; i++){
printf("%i ",numbers[i]);
}
printf("\n");
merge_sort(numbers,SIZE);
for (int i = 0; i < SIZE; i++){
printf("%i ",numbers[i]);
}
printf("\n");
}
補充說明(Supplement):
作者: LPH66 (-6.2598534e+18f)   2018-10-23 01:38:00
用 sizeof 求陣列長度只在你這變數真的是個陣列時有用你這裡傳進函數之後它就 decay 成指標了, 所以不能使用(是的, 雖然是寫 [] 但骨子裡它依然只是一個指標)C 的陣列沒有自帶長度資訊, 要求長度要嘛另外傳要嘛學字串你這裡另外傳會比較容易一點
作者: c910335 (達人)   2018-10-23 00:28:00
大概是因為你誤解 sizeof 了https://ideone.com/XusuuF

Links booklink

Contact Us: admin [ a t ] ucptt.com