| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 591 人关注过本帖
标题:(分享) 归并排序的最原始实现, 不带优化的。
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:20 回复次数:7 
(分享) 归并排序的最原始实现, 不带优化的。
各种排序是常见的面试题, 我希望能够帮助大家轻松的秒杀那些小菜鸟

#include <stdio.h>
#include <stdlib.h>

#define MAX_NUM 10

void mergeSort(int a[], int left, int right);

void merge(int a[], int left, int m, int right);

int main(void)
{
    int a[MAX_NUM] = {1, 3, 2, 1, 6, 1, 5, 8, 1, 0};
    int i;

    mergeSort(a, 0, MAX_NUM-1);
   
    for (i = 0; i < MAX_NUM; i++)
    {
        printf("%d ", a[i]);
    }

    getchar();
    return 0;
}

void merge(int a[], int left, int m, int right)
{
    int aux[MAX_NUM] = {0};
    int i, j, k;

    for (i = left, j = m+1, k = 0; k <= right-left; k++)
    {
        if (i == m+1)
        {
            aux[k] = a[j++];
            continue;
        }

        if (j == right+1)
        {
            aux[k] = a[i++];
            continue;
        }

        if (a[i] < a[j])
        {
            aux[k] = a[i++];
        }
        else
        {
            aux[k] = a[j++];
        }
    }

    for (i = left, j = 0; i <= right; i++, j++)
    {
        a[i] = aux[j];
    }
}

void mergeSort(int a[], int left, int right)
{
    int m = (right + left) / 2;

    if (right <= left)
        return ;

    mergeSort(a, left, m);
    mergeSort(a, m+1, right);
    merge(a, left, m, right);
}


[ 本帖最后由 BlueGuy 于 2011-1-7 22:54 编辑 ]
搜索更多相关主题的帖子: 小菜 
2011-01-07 13:14
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
严格的说,这代码属于我半原创代码, 网络上应该找不到第二份这样的简单的~~~

我就是真命天子,顺我者生,逆我者死!
2011-01-07 18:59
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:20 









                    抢位置的   不知道欢迎不
2011-01-07 19:43
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:0 





                看得懂代码      只是不知道 这代码优秀在哪里;
            

                求解释@!!


                                    不过  我觉得冒泡跟简单哈
2011-01-07 19:51
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
优秀在于,你能看的懂,

我就是真命天子,顺我者生,逆我者死!
2011-01-07 20:38
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
如果按照 2^n 个数 调用 排序函数, 可以清楚的看到 归并排序的 分治树 是一棵完全二叉树, 如下
    mergeSort(0, 7): 1
        mergeSort(0, 3): 2
            mergeSort(0, 1): 3
                mergeSort(0, 0): 4
                mergeSort(1, 1): 4
            mergeSort(2, 3): 3
                mergeSort(2, 2): 4
                mergeSort(3, 3): 4
        mergeSort(4, 7): 2
            mergeSort(4, 5): 3
                mergeSort(4, 4): 4
                mergeSort(5, 5): 4
            mergeSort(6, 7): 3
                mergeSort(6, 6): 4
                mergeSort(7, 7): 4

我就是真命天子,顺我者生,逆我者死!
2011-01-07 21:12
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
如果换个方式打印, 又可以清楚的看到  归并排序的 合并过程属于 后序遍历二叉树,如下
    mergeSort(0, 3)
        mergeSort(0, 1)
            mergeSort(0, 0)
            mergeSort(1, 1)
            merge(0, 0, 1)
        mergeSort(2, 3)
            mergeSort(2, 2)
            mergeSort(3, 3)
            merge(2, 2, 3)
        merge(0, 1, 3)
    mergeSort(4, 7)
        mergeSort(4, 5)
            mergeSort(4, 4)
            mergeSort(5, 5)
            merge(4, 4, 5)
        mergeSort(6, 7)
            mergeSort(6, 6)
            mergeSort(7, 7)
            merge(6, 6, 7)
        merge(4, 5, 7)
    merge(0, 3, 7)

[ 本帖最后由 BlueGuy 于 2011-1-7 22:44 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-01-07 22:42
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:0 




帮忙顶!!!



                    谢谢解释
2011-01-08 13:16
快速回复:(分享) 归并排序的最原始实现, 不带优化的。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017125 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved