zoukankan      html  css  js  c++  java
  • 归并排序算法

    归并排序:  实际就是递归,  分治 的运用。

    思路:       假设一个数组    4  2  3  1    

             二分德到     4   2                             3   1  两个数组

             分到不能再分的时候再进行排序

    例如            {4,2}  数组  分为         {4}     {2}  两个数组        然后合并治理   得到   {2,4}

    这样说很抽象,那就直接来个例子   

               上面进行了一次操作之后得到        {2,4}  {1,3}  两个有序数组 

          我们声明一个temp[]数组         然后分别都 {2,,4}{1,3}     比较      2 与1比较     将小的放入temp中    ----->      temp[0]=1

                            继续       2与3比较,                   --------->temp[1] =2

                        然后  4 ,3比较             ---------->temp[2]=3                        注意   两个数组没有一个填充完的时候,那么分别取前数组的第一个进行比较,然后放入temp数组中

    代码:

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    void merge(int arr[],int first,int mid,int last)
    {
    int *temp=new int[last-first+1];
    int i,j,cnt=0;
    for (i=first,j=mid+1;i<=mid&&j<=last;){
    if (arr[i]<arr[j]){
    temp[cnt++]=arr[i++];
    }
    else {
    temp[cnt++]=arr[j++];
    }
    }
    for (;i<=mid;) //第一个序列有剩余
    temp[cnt++]=arr[i++];
    for (;j<=last;) //第二个序列有剩余
    temp[cnt++]=arr[j++];
    for (j=0,i=first;i<=last;i++,j++)
    arr[i]=temp[j];
    delete[] temp;
    }
    void merge_sort(int arr[],int start,int end)
    {
    if (start<end){
    int mid=(start+end)/2;
    merge_sort(arr,start,mid);
    merge_sort(arr,mid+1,end);
    merge(arr,start,mid,end);
    }
    }
    int main()
    {
    int i,a[]={9,5,4,2,7,8,1,3,6,0};
    printf ("排序前 ");
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    cout<<endl;
    merge_sort(a,0,9);//分 // merge_sort(数组名,a,b) 只对 数组名[a] 到 数组名[b] 进行排序,小于a或大于b 则不进行处理
    for(i=0;i<10;i++)
    printf("%d ",a[i]); printf(" ");
    system("pause");
    return 0;
    }

  • 相关阅读:
    Jzoj5408 Dark
    Jzoj5407 Deep
    Jzoj5407 Deep
    Jzoj5456【NOIP2017提高A组冲刺11.6】奇怪的队列
    Jzoj5456【NOIP2017提高A组冲刺11.6】奇怪的队列
    Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
    Codeforces Round #621 (Div. 1 + Div. 2)C
    Codeforces Round #621 (Div. 1 + Div. 2)B Cow and Friend
    PAT甲级——A1031 Hello World for U
    PAT甲级——A1029 Median
  • 原文地址:https://www.cnblogs.com/q1204675546/p/9282865.html
Copyright © 2011-2022 走看看