排序(6)---------歸併排序(C語言實現)
阿新 • • 發佈:2018-12-23
歸併排序:
歸併操作,也叫歸併演算法,指的是將兩個已經排序的序列合併成一個序列的操作。歸併排序演算法依賴歸併操作。
歸併操作的過程如下:(1) 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
(2) 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
(3) 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
(4) 重複步驟3直到某一指標到達序列尾
(5) 將另一序列剩下的所有元素直接複製(抄)到合併序列尾
簡單的說,就是將一個序列不斷的進行二分(當然也可以三分、多分)分裂,然後遞迴下去,再合併。
原始碼:
/*============================================================================= # # FileName: Merge_Sort.c # Desc: 歸併排序 # # Author: zhangyuqing # # Created: 2014年6月29日23:18:16 # Version: 0.0.1 # =============================================================================*/ #include "stdafx.h" #include <stdlib.h> #include <malloc.h> //歸併操作 void merge(int src[], int des[], int low, int high ,int mid) { int i = low; int k = low; int j = mid + 1; while (( i <= mid ) && ( j <= high )) { if (src[i] < src[j]) { des[k++] = src[i++]; } else { des[k++] = src[j++]; } } while (i <= mid) { des[k++] = src[i++]; } while (j <= high) { des[k++] = src[j++]; } } void MSort(int src[], int des[] ,int low, int high, int max_size) { int mid = (low + high) / 2; if (low == high) { des[low] = src[low]; } else { int mid = (low + high) / 2; int * des_space = (int *)malloc(sizeof(int) * max_size); if (NULL != des_space) { MSort( src, des_space, low, mid, max_size); MSort( src, des_space, mid+1, high, max_size); merge( des_space, des, low, high, mid); } free(des_space); } } void Meger_Sort(int arr[], int low, int high, int len) { MSort( arr, arr, low, high, len); } int main(void) { int arr[10]; for ( int i=0; i<10; i++) //初始化資料 { arr[i] = rand()%100; //隨機生成資料 } printf("Before sort:\n"); //列印排序前的資料 for (int i = 0; i < 10; i++) { printf("%d ",arr[i]); } //開始排序 Meger_Sort( arr, 0, 10-1, 10); printf("\nAfter sort:\n"); //列印排序後的資料 for (int i = 0; i < 10; i++) { printf("%d ",arr[i]); } system("pause"); return 0; }
執行結果:
Before sort:
41 67 34 0 69 24 78 58 62 64
After sort:
0 24 34 41 58 62 64 67 69 78 請按任意鍵繼續. . .
如有錯誤,望不吝指出。