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