• 归并排序的进一步理解


    归并排序,顾名思义-先递归再合并的排序方式,一层一层的递归,当递归到最底层的时候,进行合并操作,这也是分治算法的经典运用。

    首先是要进行把两个有序的序列进行合并操作,需要借助辅助空间,先把有序序列存储在辅助空间中,在从辅助空间把有序序列复制到原序列中,完成合并操作,相应代码如下:

    void Merge(int a[] , int first , int mid , int last , int temp[])   {
        int i = first , j = mid + 1 , k = 0 ;
        while(i <= mid && j <= last)
            if(a[i] < a[j])
                temp[k++] = a[i++] ;
            else
                temp[k++] = a[j++] ;
            while(i <= mid)
                temp[k++] = a[i++] ;
            while(j <= last)
                temp[k++] = a[j++] ;
            for(i = 0 ; i < k ; i++)
                a[first+i] = temp[i] ;
    }

    然后就是递归函数的操作,先把原来序列分成两组无序序列,再分别把这两组无序序列分别分为两个无序序列,直到不能再分为止,默认单个元素为有序序列,然后进行合并排序,相应代码如下:

    void Mergesort(int a[] , int first , int last , int temp[]) {
        if(first < last)    {
            int mid = (first + last) / 2 ;
            Mergesort(a,first,mid,temp) ;
            Mergesort(a,mid+1,last,temp) ;
            Merge(a,first,mid,last,temp) ;
        }
    }

    全部归并排序算法代码实现如下:

    #include<stdio.h>
    
    void Merge(int a[] , int first , int mid , int last , int temp[])   {
        int i = first , j = mid + 1 , k = 0 ;
        while(i <= mid && j <= last)
            if(a[i] < a[j])
                temp[k++] = a[i++] ;
            else
                temp[k++] = a[j++] ;
            while(i <= mid)
                temp[k++] = a[i++] ;
            while(j <= last)
                temp[k++] = a[j++] ;
            for(i = 0 ; i < k ; i++)
                a[first+i] = temp[i] ;
    }
    
    void Mergesort(int a[] , int first , int last , int temp[]) {
        if(first < last)    {
            int mid = (first + last) / 2 ;
            Mergesort(a,first,mid,temp) ;
            Mergesort(a,mid+1,last,temp) ;
            Merge(a,first,mid,last,temp) ;
        }
    }
    
    int main()  {
        int n ;
        scanf("%d",&n) ;
        int a[100] , i;
        for(i = 0 ; i < n ; i++)
            scanf("%d",&a[i]) ;
        int *temp = new int[n] ;
        Mergesort(a,0,n-1,temp) ;
        delete[] temp ;
        for(i = 0 ; i < n ; i++)
            printf("%d ",a[i]) ;
        printf("
    ") ;
        return 0 ;
    }

    归并排序算法的效率还是比较高的,设数列长度为n,则将数列分为小数列一共需要logN步,每步都是合并有序数列的过程,所以归并排序的时间复杂度为:O(N*logN),空间复杂度为O(n);

  • 相关阅读:
    LeetCode-top100-3. 无重复字符的最长子串
    最长单调递增子序列 POJ 3903 Stock Exchange .
    并查集 POJ 1988 Cube Stacking
    贪心初步 hdu1789 Doing Homework again
    并查集初步题目(2)
    并查集初步题目(1)
    【python】引用模块,以及初探__init__.py
    Python 模块里函数的调用方法和import语句的作用(初学者版)
    二分查找算法
    python之内置函数,匿名函数
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237403.html
Copyright © 2020-2023  润新知