[問題] 要將一個陣列改成median heap的程式
我寫了一個程式,內容是要將輸入的陣列變成一個滿足某個節點離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
11/06 03:07, 2F
→
11/06 03:08, , 3F
11/06 03:08, 3F
→
11/06 03:09, , 4F
11/06 03:09, 4F
→
11/06 03:10, , 5F
11/06 03:10, 5F
→
11/06 03:14, , 6F
11/06 03:14, 6F
→
11/06 09:25, , 7F
11/06 09:25, 7F
→
11/06 14:08, , 8F
11/06 14:08, 8F
→
11/06 14:11, , 9F
11/06 14:11, 9F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章