歸併演算法採用的是分治的思想,是不斷將乙個序列一分為二,最後合併進行排序的乙個過程。
在下面的**中,mergepass函式起的作用就是「分」,而merge_array函式的作用是「治」和「合」。
最後在主函式中通過迴圈的方法實現了非遞迴實現。
時間複雜度是o(nlogn),排序穩定
// an highlighted block
#include
using namespace std;
int test1[
100000];
int test2[
100000];
void
merge_array
(int *c,int *d,int l,int m,int r)
;void
mergepass
(int *c,int *d,int s,int length_t)
;int main
(void
)for
(int k=
0;k) cout<<<
" ";
}void
mergepass
(int *c,int *d,int s,int length_t)
if(i+s//剩下的部分小於2s,分為大於s或者小於等於s
else
//小於等於s
}void
merge_array
(int *c,int *d,int l,int m,int r)
if(i>m)
else
}
如題:進行兩次排序
// an highlighted block
#include
using namespace std;
int test1[
10000];
int test2[
10000];
int test3[
10000];
void
merge_array1
(int *c,int *d,int l,int m,int r)
;void
mergepass1
(int *c,int *d,int s,int l,int r)
;void
merge_array2
(int *c,int *d,int l,int m,int r)
;void
mergepass2
(int *c,int *d,int s,int l,int r)
;int main
(void
)while
(ss=1;
while
(sfor(int k=
0;k) cout<<<
" ";
}void
mergepass1
(int *c,int *d,int s,int l,int r)
if(i+s//剩下的部分小於2s,分為大於s或者小於等於s
else
//小於等於s
}void
merge_array1
(int *c,int *d,int l,int m,int r)
if(i>m)
else
}void
mergepass2
(int *c,int *d,int s,int l,int r)
if(i+s//剩下的部分小於2s,分為大於s或者小於等於s
else
//小於等於s
}void
merge_array2
(int *c,int *d,int l,int m,int r)
if(i>m)
else
}
#include
using namespace std;
long airball[
100000];
//氣球高度
long a[
100000];
int getrank[
100000];
//相應的小朋友排名對映。初始標號到排名的對映
long height[
100000];
//小朋友跳的高度
long origin[
100000];
void
mergepass
(long *c,long *d,int length,int s)
;void
merge_array
(long *c,long *d,int l,int m,int r)
;int main
(void
)for
(i=0
;i) cin>>airball[i]
;//氣球高度就直接歸併排序吧
int s=1;
while
(s//氣球序列排好了
//選擇排序進行操作吧
for(i=
0;i) getrank[i]
=i; int minh=0;
int k=0;
int j=0;
long temp1=0;
int temp2=0;
for(
;k++k)
} temp1=height[k]
; height[k]
=height[minh]
; height[minh]
=temp1;
temp2=getrank[k]
; getrank[k]
=getrank[minh]
; getrank[minh]
=temp2;
}//歸併排序出了一點錯
//依次輸出吧,temp1作為臨時變數儲存資料
j=0;
for(i=
0;i++i)
else
origin[getrank[i]]=
0;}for
(i=0
;i1;i++
) cout<
//歸併排序
void
mergepass
(long *c,long *d,int length_t,int s)
if(i+s//剩下的部分小於2s,分為大於s或者小於等於s
else
//小於等於s
}void
merge_array
(long *c,long *d,int l,int m,int r)
if(i>m)
else
}
最近做的幾道筆試題,很有意思
1.h 6 輸出物件中所有的屬性名,包括被巢狀的。當時覺得就是迭代輸出麼,for key in obj 然後obj.key就好了。後發現key這裡面是字元型的,obj.key會出問題。所以這裡應該考得是物件屬性的另一種寫法吧 obj key key是字元型的。這裡設定全域性變數ff儲存屬性名是不好的...
幾道有意思的邏輯分析題
1.某人喝了三鹿牛奶不幸得了某種怪病,去黑診所開了兩種無名藥 a和b.有兩個瓶子a和b,a瓶子裡裝3片a,b瓶子裡裝3片b,a和b藥品的形狀,重量,顏色和味道等等完全一樣.醫生吩咐每天吃一片a和一片b,一共三天.正確服用就可以完全 不正確服用就會去天堂 第一天此人吃了一片a和一片b.第二天發現有人動...
說幾道有意思的面試題
很長時間沒有寫部落格,突然想起來現在的公司的面試題。選了比較有意思的幾道題,寫一篇部落格談一談。祖傳 的重構 題目描述 現在有乙個函式add 裡面 很複雜實現了一系列的功能。不能不去重構他會波及太大,所以不能改函式裡面的 但新需求是要知道在 呼叫了這個函式,這個函式被呼叫了多少次 count 和被例...