经典排序之归并排序

简介:
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/**
    分治法排序:
    1、分解。2、解决。3、合并。
**/

void merge(int* a,int p,int q,int r)
{
    int i,j;
    for(i=p,j=q; i<q && j<r;)
    {
        if(a[i] <= a[j])
        {
            i++;
            continue;
        }else
        {
            int k;
            int tem = a[j];
            for(k = j; k > i; k--)
            a[k] = a[k-1];
            a[k] = tem;
            j++;
            i++;//
            q++;//注意这里移动了i,那么q也要一起移动~~
        }
    }
}

void divide(int* a,int length)
{
    if(length > 1 )
    {
        int v = length/2;
        divide(a,v);
        divide(a+v,length-v);
        merge(a,0,v,length);
    }
}

int main()
{
    int A[] = {3,41,52,26,38,57,9,49,1,55,45,5,6,49};
    int length = sizeof(A)/sizeof(int);

    for(int i = 0; i < length; i++)
    printf("%d ",A[i]);
    printf("\n");

    divide(A,length);

    for(int i = 0; i < length; i++)
    printf("%d ",A[i]);
    printf("\n");
    return 0;
}
复制代码

归并排序想法很简单,类似于分治法,先将一个长长的序列分成若干子序列,然后合并,其核心就在于合并过程。算法导论中这样描述:想象一下桌子上放好了两副排好顺序的扑克,然后要把这两副扑克合并成一幅排好顺序的扑克,那么就分别从两副扑克的最上边取最小的然后组成一个新的序列。取完之后即完成了排序。归并排序就是利用这个思想。

注意点:1、数组模仿时,注意当数组元素移动时,移动标志位。













本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2013/03/20/2971971.html,如需转载请自行联系原作者

相关文章
|
算法 API 索引
算法排序6——快速排序(分治思想)
对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理
129 0
算法排序6——快速排序(分治思想)
|
搜索推荐 算法 Java
算法排序-归并排序
Java系统提供的Arrays.sort函数。对于基础类型,底层使用快速排序。对于非基础类型,底层使用归并排序。请问是为什么?   答:这是考虑到排序算法的稳定性。
|
算法 JavaScript 人工智能
|
机器学习/深度学习 人工智能
|
机器学习/深度学习 人工智能
|
算法 Shell 人工智能