归并排序

归并排序

什么是归并排序:

  • 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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;
    }
    


你可能感兴趣的:(排序,数据结构与算法)