标签:
归并排序也是一种常用的排序算法, 其时间复杂度为O(n*logn), 它的基础是分治的思想。
其基本思路就是把数组分成两组A,B, 如果这两组内的数据都是有序的, 那么就可以很方便的对这两组数据进行合并排序。
但是如何让这两组数据有序呢? 归并法的思想就是把A,B两组各自再分成两组, 依次类推, 当分出来的小组数据只有一个的时候, 即可以认为小组数据已经达到了有序。
然和合并相邻的两个小组就OK了~
归并法的C语言实现如下:
1 //合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了 2 void mergeArray(int a[], int first, int mid, int last) { 3 4 int i, j, m, n; 5 i = first, m = mid; 6 j = mid+1, n = last; 7 int k = 0; 8 int temp[SIZE]; 9 10 while(i<=m && j<=n) { 11 if(a[i] < a[j]) { 12 temp[k++] = a[i++]; 13 } else { 14 temp[k++] = a[j++]; 15 } 16 } 17 18 while(i<=m) temp[k++] = a[i++]; 19 while(j<=n) temp[k++] = a[j++]; 20 21 for(i=0; i<k; i++) { 22 a[first+i] = temp[i]; 23 } 24 25 } 26 //归并排序 27 void merge_sort(int a[], int start, int end) { 28 int mid = (start+end)/2; 29 if(start<end) { 30 merge_sort(a, start, mid); 31 merge_sort(a, mid+1, end); 32 mergeArray(a, start, mid, end); 33 } 34 }
一个简单的测试用例,代码如下:
#include<stdio.h> #define SIZE 10 //合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了 void mergeArray(int a[], int first, int mid, int last) { int i, j, m, n; i = first, m = mid; j = mid+1, n = last; int k = 0; int temp[SIZE]; while(i<=m && j<=n) { if(a[i] < a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while(i<=m) temp[k++] = a[i++]; while(j<=n) temp[k++] = a[j++]; for(i=0; i<k; i++) { a[first+i] = temp[i]; } } //归并排序 void merge_sort(int a[], int start, int end) { int mid = (start+end)/2; if(start<end) { merge_sort(a, start, mid); merge_sort(a, mid+1, end); mergeArray(a, start, mid, end); } } int main() { int a[SIZE]; int i; printf("Please input the num:\n"); for(i=0; i<SIZE; i++) { scanf("%d",&a[i]); } printf("before the sort:\n"); for(i=0; i<SIZE; i++) { printf("%d ", a[i]); } printf("\n"); merge_sort(a, 0, SIZE-1); printf("after the sort:\n"); for(i=0; i<SIZE; i++) { printf("%d ", a[i]); } printf("\n"); }
标签:
原文地址:http://www.cnblogs.com/beyond-Acm/p/4334145.html