今天寫的是歸併排序,歸併排序的定義為:依次將每兩個相鄰的有序表合併成乙個有序表的排序方法。最經常使用的歸併方法是2-路歸併。假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到⎡n/2⎤個長度為2或1的有序子串行;再兩兩歸併,……,如此重複,直至得到乙個長度為n的有序序列為止,這種排序方法稱為2-路歸併排序。今天的演算法**就是按照2-路歸併排序的思想寫的。
**如下:
#include
#include
/* * arr為待排序陣列,歸併的元素為arr[s...m]和arr[m+1...n]*/
void
merge
(int arr,
int s,
int m,
int n)
else}if
(i <= m)}if
(j <= n)
}for
(i =
0;i < k;i++
)free
(arr1);}
void
mergesort
(int arr,
int len)
else}}
}int
main()
;for
(i =
0;i <
7;i++
)printf
("\n");
mergesort
(arr,7)
;for
(i =
0;i <
7;i++
)printf
("\n");
return0;
}
歸併排序演算法之前很少用到,之前讀書的時候也沒有寫過完整的**執行過,所以今天還是稍微費了一點時間才寫好,主要是以往的排序演算法,我都是從下標1開始的,0號單元沒有使用。而今天則是從0號單元開始,導致邊界條件控制的有問題。這個也提醒了我,以後寫**要具體情況具體分析,不能想當然。
**的道路還很長,演算法的精通也不是靠一兩日之功,經驗的積累更是在不斷犯錯中才實現的。之前一直很浮躁,做事情堅持不了幾天,導致現在一無所長。現在看明白了自己想要的是什麼,就應該堅定自己的信念,朝著自己的目標走下去~加油!
C語言小白歸併排序
歸併排序採用分治法,排序速度快,排序中不改變輸入順序 主要思路乙個陣列進行二分,再將左右分別進行二分直至只有乙個數 即有序 再合併陣列使其有序,完成排序 include include void merge int sourcearr,int temparr,int startindex,int m...
C語言歸併排序
描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。歸併排序有兩個關鍵點 1.將兩個已經排好序的序列進行合併。歸併2個有序序列為1個有序序列 void merg...
c語言寫歸併排序
歸併排序,在實際開發中,很少用,但是為什麼一定要掌握它,甚至在面試中經常會問到。其實,只是為了更好的理解演算法。歸併排序最核心的就是分治策略,所謂分治,就是把乙個問題,拆分成若干個小問題然後求解。掌握歸併排序以後,在遇到更複雜的問題,我們可以考慮分治策略。歸併排序是穩定的,時間複雜度是o nlogn...