经典排序之归并排序

简介:

归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

复制代码
#include <stdio.h>
#include <stdlib.h>

/*
归并排序
mergeSort
说明:mergeSort需要借助一个O(n)大小的空间存储排序数组,
*/

void merge(int *a,int first,int mid,int last,int *p)
{
    int i = first,j=mid+1;
    int k = first;
    while(i<=mid&&j<=last)
    {
        if(a[i]<a[j])p[k] = a[i++];
        else p[k]=a[j++];
        k++;
    }
    while(i<=mid)p[k++] = a[i++];
    while(j<=last)p[k++] = a[j++];
    for (int i = first; i <= last; i++)
    {
        a[i] = p[i];
    }
}


void mergeSort(int *a,int first,int last,int *p)
{
    if(first < last)
    {
        int mid = (last+first)/2;
        mergeSort(a,first,mid,p);
        mergeSort(a,mid+1,last,p);
        merge(a,first,mid,last,p);
    }
    
}
int main(int argc, char **argv)
{
    
    int a[] = {2,24,3,19,45,12,1,66,34,7};
    int size;
    int i;
    size = sizeof(a)/sizeof(int);
    int *p = (int*)malloc(sizeof(int)*(size+1));
    mergeSort(a,0,size-1,p);
    for(i = 0; i < size; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    free(p);
    return 0;
}
复制代码

 









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



相关文章
【经典排序】插入与希尔排序
【经典排序】插入与希尔排序
69 0
|
算法 搜索推荐 C++
算法基础(一)| 快速排序和归并排序详解
⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有一定的C++基础的学习者。
99 0
|
搜索推荐 算法 Java
算法排序-归并排序
Java系统提供的Arrays.sort函数。对于基础类型,底层使用快速排序。对于非基础类型,底层使用归并排序。请问是为什么?   答:这是考虑到排序算法的稳定性。
|
算法 JavaScript 人工智能
|
机器学习/深度学习 人工智能
|
机器学习/深度学习 人工智能
|
算法 Shell 人工智能