码迷,mamicode.com
首页 > 编程语言 > 详细

基础算法之归并排序

时间:2015-03-13 01:40:04      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

归并排序也是一种常用的排序算法, 其时间复杂度为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");
}
View Code

 

基础算法之归并排序

标签:

原文地址:http://www.cnblogs.com/beyond-Acm/p/4334145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!