[問題] 要將一個陣列改成median heap的程式

看板C_and_CPP (C/C++)作者 (とある煞氣の光希)時間15年前 (2010/11/06 02:47), 編輯推噓0(009)
留言9則, 3人參與, 最新討論串1/1
我寫了一個程式,內容是要將輸入的陣列變成一個滿足某個節點離median比他的左小孩跟 右小孩離median還近,也就是絕對值差最小,的一個heap 編譯有成功,可是不知道為什麼main裡頭的S不管是否做了BUILD_MEDIAN_HEAP印出來的順 序都一樣,C語言函數傳陣列不是按址傳遞嗎?所以原S應該會改變,要不然就是函數根本 沒發揮我想要它做的功效,請各位幫我看看,謝謝 #include <stdio.h> #include <stdlib.h> const int median=10; /*自己先把S的中間值找了*/ int ABS(int); /*算絕對值*/ int LEFT(int); /*找左小孩*/ int RIGHT(int); /*找右小孩*/ void BUILD_MEDIAN_HEAP(int[],int); /*將陣列S變成median heap*/ void MEDIAN_HEAPIFY(int[],const int,int); /*對應節點i,將i以下變成median heap 前提是左右子樹皆為median heap*/ int main(void) { int S[7]={1,13,3,2,11,12,10}; /*我自己弄得例子*/ int i; /*先把S印出來*/ for(i=0;i<7;i++) printf("%d ",S[i]); printf("\n"); BUILD_MEDIAN_HEAP(S,7); /*把結果印出來*/ for(i=0;i<7;i++) printf("%d ",S[i]); printf("\n"); system("PAUSE"); return 0; } void BUILD_MEDIAN_HEAP(int A[],int L) { int i; for(i=L/2;i<=1;i--) /*L/2算出來會自動無條件捨去變成整數*/ MEDIAN_HEAPIFY(A,i-1,L); } void MEDIAN_HEAPIFY(int A[],const int i,int L) { int j,swap,l,r,closest; /*closest代表節點i與左右小孩誰比較靠近median的index*/ l=LEFT(i); r=RIGHT(i); if(l<L && ABS(A[l]-median)<ABS(A[i]-median)) closest=l; else closest=i; if(r<L && ABS(A[r]-median)<ABS(A[i]-median)) closest=r; if(closest!=i) { swap=A[i]; A[i]=A[closest]; A[closest]=swap; MEDIAN_HEAPIFY(A,closest,L); } } int ABS(int n) { if(n>0) return n; else return -n; } int LEFT(int i) { return (i+1)*2-1; } int RIGHT(int i) { return (i+1)*2; } -- 律:知道嗎?聽說我們的歌被海外的電視台所錄用耶!看來我們離武道館不遠了 唯:真的嗎?那真的是太好了,我一直夢想能在武道館彈著吉太,好高興 紬:小唯能高興真的是太好了,呵呵~ 澪:拜託!那個明明是盜用不是錄用,你們怎麼還這麼高興? 律、唯、紬:啊?什麼? 輕音部 澪:絕望啦!我對盜用錄用分不清楚的輕音部社員們絕望啦! 邁向武道館之路 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.232.3 ※ 編輯: k6416337 來自: 140.113.232.3 (11/06 02:49)

11/06 03:06, , 1F
我沒看完你整個程式碼,也看不太懂這程式想做啥
11/06 03:06, 1F

11/06 03:07, , 2F
但是我看到你的BUILD_MEDIAN_HEAP函式中的for迴圈有問題
11/06 03:07, 2F

11/06 03:08, , 3F
for(i=L/2; i<=1; i++)你一開始傳入的L是7,除以2後得3
11/06 03:08, 3F

11/06 03:09, , 4F
那他就大於1了阿,根本沒跑就跳出迴圈了
11/06 03:09, 4F

11/06 03:10, , 5F
所以等於什麼都沒動作,值也當然也不會改
11/06 03:10, 5F

11/06 03:14, , 6F
抱歉打錯,for(i=L/2; i<=1; i--),但是一樣不會跑
11/06 03:14, 6F

11/06 09:25, , 7F
重點是 i=L/2 i早就大於1了 是不是 i>=1; i-- ?
11/06 09:25, 7F

11/06 14:08, , 8F
原來是大於等於寫成小於等於了
11/06 14:08, 8F

11/06 14:11, , 9F
這個程式是修改max heap sort演算法得來的
11/06 14:11, 9F
文章代碼(AID): #1Cr55TfZ (C_and_CPP)
文章代碼(AID): #1Cr55TfZ (C_and_CPP)