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

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

    //将有序数组a[]和b[]合并到c[]中
    void MemeryArray(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++] = a[i++];
            else
                c[k++] = b[j++]; 
        }
    
        while (i < n)
            c[k++] = a[i++];
    
        while (j < m)
            c[k++] = b[j++];
    }
    void Merge(int src[], int des[], int low, int mid, int high)
    {
        int i = low;
        int j = mid + 1;
        int k = low;
    
        while( (i <= mid) && (j <= high) ) //将小的放到目的地中
        {
            if( src[i] < src[j] )
            {
                des[k++] = src[i++];
            }
            else
            {
                des[k++] = src[j++];
            }
        }
    
        while( i <= mid )  //若还剩几个尾部元素
        {
            des[k++] = src[i++];
        }
    
        while( j <= high ) //若还剩几个尾部元素
        {
            des[k++] = src[j++];
        }
    }
    
    //每次分为两路 当只剩下一个元素时,就不需要在划分
    void MSort(int src[], int des[], int low, int high, int max)
    {
        if( low == high ) //只有一个元素,不需要归并,结果赋给des[low]
        {
            des[low] = src[low]; 
        }
        else //如果多个元素,进行两路划分
        {
            int mid = (low + high) / 2;
            int* space = (int*)malloc(sizeof(int) * max);
    
            //递归进行两路,两路的划分 
            //当剩下一个元素的时,递归划分结束,然后开始merge归并操作
            if( space != NULL )
            {
                MSort(src, space, low, mid, max); 
                MSort(src, space, mid+1, high, max);
                Merge(space, des, low, mid, high); //调用归并函数进行归并
            }
    
            free(space);
        }
    }
    
    void MergeSort(int array[], int len) // O(n*logn)
    {
        MSort(array, array, 0, len-1, len);
    }
    
    int main()
    {
        
        //int array[] = {21, 25, 49, 25, 16, 8};
        int array[] = {21, 25};
        int len = sizeof(array) / sizeof(*array); 
        printArray06(array, len);
        MergeSort(array, len);
        printArray06(array, len);
        system("pause");
        return 0;
    }
  • 相关阅读:
    JavaScript基础知识(数组的方法)
    JavaScript基础知识(字符串的方法)
    JavaScript基础知识(Number的方法)
    JavaScript基础知识(函数)
    JavaScript基础知识(三个判断、三个循环)
    JavaScript基础知识(数据类型)
    JavaScript基础知识(初识JS)
    iOS开发--Swift 基于AFNetworking 3.0的网络请求封装
    iOS开发--Swift 如何完成工程中Swift和OC的混编桥接(Cocoapods同样适用)
    如何为Swift进行宏定义
  • 原文地址:https://www.cnblogs.com/wangjian920110/p/5527989.html
Copyright © 2011-2022 走看看