每日一題 歸併排序

2021-10-18 06:14:41 字數 1788 閱讀 8241

第一次寫部落格,大佬們輕點噴

注:作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。

這是一道比較簡單的資料結構的題目,先來看題

本題要求實現二路歸併排序中的歸併操作,待排序列的長度1<=n<=1000。

void

merge

(sqlist l,

int low,

int m,

int high)

;

其中l是待排序表,使排序後的資料從小到大排列。

#include

#include

typedef

int keytype;

typedef

struct

sqlist;

void

creatsqlist

(sqlist *l)

;/*待排序列建立,由裁判實現,細節不表*/

void

mergesort

(sqlist l,

int low,

int high)

;void

merge

(sqlist l,

int low,

int m,

int high)

;int

main()

return0;

}void

mergesort

(sqlist l,

int low,

int high)

}/*你的**將被嵌在這裡 */

第一行整數表示參與排序的關鍵字個數。第二行是關鍵字值 例如:

1052

4189

1012

36

輸出由小到大的有序序列,每乙個關鍵字之間由空格隔開,最後乙個關鍵字後有乙個空格。

123

4568

91012

這道題的編譯器要求是c(gcc 6.5.0)

先來看看要我們實現的函式功能是什麼,很簡單,就兩個字——歸併

那什麼是歸併排序?

歸併排序(merge sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略將問題分成一些小的問題然後遞迴求解,即分而治之。

不了解的可以自行詢問度娘

看著好像挺麻煩?仔細看看**,好傢伙,主體部分都給你寫好了,只要你寫乙個合併的那一段就好了,那不是超級簡單?自己開乙個陣列,乙個乙個新增進去,然後再賦值賦回去就好了

下面是我的**,因為寫這道題的時候是在考試,所以也不想著寫簡略,能過就行

void

merge

(sqlist l,

int low,

int m,

int high)

else

}else

if(x<=m)

else

if(y<=high)

} x=low;

for(

int i=

0;i1;i++

)}

這樣就好了,滿分通過!

不過,後來想想,如果想不到歸併,其實也可以開乙個陣列,排個序再賦值回去也可以的。

如有錯誤之處,敬請指正!

每日一題 歸併排序

作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。這是一道比較簡單的資料結構的題目,先來看題 本題要求實現二路歸併排序中的歸併操作,待排序列的長度1 n 1000。void mer...

每日一題 92 歸併排序

題目來自網路 題目 1 基於陣列的歸併排序 題目 2 基於鍊錶的歸併排序 題目 1 基於陣列的歸併排序 思路 借助分治的思想,總是先對待排序進行分割,之後再對兩個子串行進行合併,生成乙個有序序列。時間複雜度為o nlogn 空間複雜度為o n void merge int narr,int nsta...

2020 1 20每日一題「歸併排序」

歸併排序顧名思義有乙個化歸合併的過程,那要合併在這之前就有分離,這就是歸併排序的步驟 先將要排序的一串數字劈開,劈到最小有序數列 也就是乙個乙個的時候,只有乙個那肯定有序啊 第二步再將他們逐漸合併,繼而變成乙個有序數列。演算法複雜度 最好情況 o nlogn 最壞情況 o nlogn 平均情況 o ...