每日一題 歸併排序

2022-06-05 19:24:11 字數 1481 閱讀 3685

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

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

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

void merge(sqlist l,int low,int m,int high);
其中l是待排序表,使排序後的資料從小到大排列。

#include#includetypedef  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()

return 0;

}void mergesort(sqlist l,int low,int high)

{

/*用分治法進行二路歸併排序*/

int mid;

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

105 2 4 1 8 9 10 12 3 6

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

1 2 3 4 5 6 8 9 10 12
這道題的編譯器要求是c(gcc 6.5.0)

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

那什麼是歸併排序?

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

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

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

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

void merge(sqlist l,int low,int m,int high){

int a[high-low+1];

int x=low,y=m+1;

for(int i=0;i這樣就好了,滿分通過!

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

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

本部落格同時發布在csdn中

每日一題 歸併排序

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

每日一題 92 歸併排序

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

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

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