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

    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;

    首先来练习一下将两个有序的数组,合并成一个有序的数组

    void mergeArray(int a[], int n, int b[], int m ,int c[])
    {
        int i ,j , k;
        i = j = k = 0;
        while (i < n&&j < m)
        {
            if (a[i]>b[j])
            {
                c[k++] = b[j++];
            }
            else
            {
                c[k++] = a[i++];
            }
        }
        while (i < n)
            c[k++] = a[i++];
        while (j < n)
            c[k++] = b[j++];
    }

    数组:3,1,2,6,9

    将数组从中间位置看成两个无序的数组,然后再将左右两个无序的数组,

    再将左右两个无序的数组再从中间分开,有变成两个无序的数组。。。。

    就变成了递归的调用。最后再一次合并数组

    #include<iostream>
    
    using namespace std;
    
    void merge(int sore[],int temp[],int start, int mid,int end)
    {
        int i = start;
        int j = mid+1;
        int k = 0;
        while(i<=mid&&j<=end)
        {
           if(sore[i] >sore[j])
                 temp[k++] = sore[j++];
           else
                 temp[k++] = sore[i++];
        }
       while(i <= mid)
            temp[k++] = sore[i++];
       while(j <= end)
            temp[k++] = sore[j++];
       for(i = 0;i<K;i++)
          sore[start + i] = temp[i];
    }
    
    void mergeSort(int sore[],int temp[],int start,int end)
    {
        if(start < end)
        {
            int min = (start + end)/2;
            mergeSort(sore,temp, start,mid);
            mergeSort(sore,temp,mid+1,end);
            merge(sore,temp,start,mid,end); 
        }
    }
    
    int main()
    {
         int a[5] = {3,1,2,6,9};
         int b[5];
         mergeSort(a,b,0,4);
         for(int i = 0;i < 5;i++)
         {
             printf("%d   ", a[i]);
         }             
    } 
    

     归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(n*log2n)。

    因为要创建一个临时的数据所以空间复杂度为O(N),复杂度比较复杂,是一种稳定的排序。

  • 相关阅读:
    杂记-2
    2019CSP-S游记
    csp2020
    特征根法小记
    csp模拟赛低级错误及反思
    备份
    黑科技——树剖两次dfs转一次dfs!
    输出天干地支
    蓝桥0531-输出Y
    蓝桥0615-判断四位数字前后两组是否相等
  • 原文地址:https://www.cnblogs.com/xiaoma123/p/5220353.html
Copyright © 2011-2022 走看看