歸併排序以及最近做的幾道有意思的題目

2021-09-26 22:44:40 字數 3432 閱讀 1370

歸併演算法採用的是分治的思想,是不斷將乙個序列一分為二,最後合併進行排序的乙個過程。

在下面的**中,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 和被例...