歸併排序演算法(遞迴實現)
歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。
#ifndef MERGESORT_H #define MERGESORT_H #include <stdlib.h> template<class T> inline void MergeSort(T *a,int len) //歸併排序演算法 { T *TR = (T *)malloc(sizeof(T) * len); //動態分配一個額外的儲存空間 MSort(a,TR,0,len-1); //分裂然後呼叫歸併排序 free(TR); //釋放記憶體 } template<class T> void Merge(T a[],T TR[],int low,int mid,int high) //歸併排序 { int i = low; int j = mid + 1; int k = 0; while(i <= mid && j <= high) { if(a[i] < a[j]) //進行排序存入動態分配的陣列中 TR[k++] = a[i++]; else TR[k++] = a[j++]; } while(i <= mid) //如果前一半中還有未處理完的資料,按順序移入動態分配的陣列內 TR[k++] = a[i++]; while(j <= high) //如果後一半中還有未處理完的資料,按順序移入動態分配的陣列內 TR[k++] = a[j++]; for(int v = 0,i = low;i <= high;++v,++i) //將排序好的資料移回到原序列中 a[i] = TR[v]; } template<class T> void MSort(T a[],T temp[],int low,int high) { int mid; if(low < high) { mid = (low + high) / 2; //進行分裂 MSort(a,temp,low,mid); //將前一半繼續分裂 MSort(a,temp,mid + 1,high); //將後一半繼續分裂 Merge(a,temp,low,mid,high); //進行歸併排序 } } #endif //MERGESORT_H
#include "MergeSort.h"
#include <stdio.h>
int main()
{
int a[] = {20,19,35,33,17,42,15,55,9,5,8,3,1};
int len = sizeof(a) / sizeof(*a);
MergeSort(a,len);
printf("排序後的陣列序列:\n");
for(int i = 0;i < len;++i)
printf("%d ",a[i]);
printf("\n");
return 0;
}