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

归并排序

时间:2015-08-16 12:22:52      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:数据结构与算法   排序   

归并排序

什么是归并排序:

  • 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并排序的详细介绍:

  • 归并排序的基础就是将两个有序数组内的数按照一定顺序合并起来。那么如何做到将两个数组合并呢?
  • 这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。
  • 然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
  • 代码实现。
  • //将有序数组a[]和b[]合并到c[]中
    void MemeryArray(int *a, int n, int *b, int m, int *c)
    {
        int x,y,z;
        x=y=z=0;
    	while (x<n && y<m)
    	{
    		if (a[x] < b[y])
    			c[z++] = a[x++];
    		else
    			c[z++] = b[y++]; 
    	}
    	while (x < n)
    		c[z++] = a[x++];
    	while (y < m)
    		c[z++] = b[y++];
    }
  • 归并排序的思想是:
  • 将一个数组分为两部分A,B。如果这两部分是有序的就将这两部分合并起来。
  • 如果这两部分无序,就分别将每一部分在分为两部分,依次类推,不就排好了。
  • 代码实现。
  • #include <stdio.h>
    #include <stdlib.h>
    void MergeArray(int *a,int left,int mid,int right)
    {
        int temp[100000];
        int x,y,z;
        x=left,y=mid+1,z=0;
        while(x<=mid && y<=right)
        {
            if(a[x]<a[y])
                temp[z++]=a[x++];
            else
                temp[z++]=a[y++];
        }
        while(x<=mid)
            temp[z++]=a[x++];
        while(y<=right)
            temp[z++]=a[y++];
        for(x=0;x<z;x++)
            a[left+x]=temp[x];
    }
    void MergeSort(int *a,int left,int right)
    {
        int mid;
        if(left<right)
        {
            mid=(left+right)/2;
            MergeSort(a,left,mid);//将右边排序
            MergeSort(a,mid+1,right);//将左边排序
            MergeArray(a,left,mid,right);//将左边右边合并
        }
    }
    int main()
    {
        int a[]={8,3,6,2,5,7,9,1,4,0};
        MergeSort(a,0,9);
        for(int i=0;i<10;i++)
            printf("%d ",a[i]);
        return 0;
    }
    


版权声明:本文为博主原创文章,未经博主允许不得转载。

归并排序

标签:数据结构与算法   排序   

原文地址:http://blog.csdn.net/baidu_30541191/article/details/47700877

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