归并排序

来源:互联网 发布:painter安装教程mac 编辑:程序博客网 时间:2024/05/22 23:47

归并排序

什么是归并排序:

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


1 0
原创粉丝点击