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

    原文连接:http://www.cnblogs.com/Braveliu/archive/2013/01/14/2860456.html

    #include<iostream>
    using namespace std;
    
    //将有序数组ar[]和br[]合并到cr[]中
    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  PrintArr(int ar[],int n)
    {
        for(int i = 0; i < n; ++i)
            cout<<ar[i]<<" ";
        cout<<endl;
    }
    
    void main()
    {
        int ar[5] = {12, 23, 34, 45, 56};
        int br[5] = {13, 24, 35, 46, 60};
        int cr[10];
        cout<<"数组ar为:"<<endl;
        PrintArr(ar, 5);
        cout<<"数组br为:"<<endl;
        PrintArr(ar, 5);
        MemeryArray(ar, 5, br, 5, cr);
        cout<<"合并后结果为:"<<endl;
        PrintArr(cr, 10);
    }
    
    /*
    数组ar为:
    12 23 34 45 56
    数组br为:
    12 23 34 45 56
    合并后结果为:
    12 13 23 24 34 35 45 46 56 60
    */
    #include<iostream>
    using namespace std;
    
    #define  MAXSIZE  10
    
    //将两个有序数列a[first...mid] 和 a[mid...last] 合并。
    void mergearray(int a[], int first, int mid, int last, int temp[])
    {
        int i = first, j = mid + 1;
        int m = mid, n = last;
        int k = 0;
    
        while (i <= m && j <= n)
        {
            if (a[i] <= a[j])
                temp[k++] = a[i++];
            else
                temp[k++] = a[j++];
        }
    
        while (i <= m)
            temp[k++] = a[i++];
    
        while (j <= n)
            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);  //右边有序
            mergearray(a, first, mid, last, temp); //再将两个有序数列合并
        }
    }
    
    bool MergeSort(int a[], int n)
    {
        int *p = new int[n];
        if (p == NULL)
            return false;
        mergesort(a, 0, n - 1, p);
        delete[] p;
        return true;
    }
    
    void  PrintArr(int ar[],int n)
    {
        for(int i = 0; i < n; ++i)
            cout<<ar[i]<<" ";
        cout<<endl;
    }
    
    void main()
    {
        int ar[MAXSIZE] = {23, 34, 45, 78, 90, 12, 49, 92, 32, 19};
        PrintArr(ar, MAXSIZE);
        bool bValue = MergeSort(ar, MAXSIZE);
        if(!bValue)
        {
            cout<<"MergeSort  Failed!! "<<endl;
        }
        PrintArr(ar, MAXSIZE);
    }
    #include<iostream>
    #include<malloc.h>
    using namespace std;
    
    #define   MAXSIZE  10
    
    void  PrintArr(int ar[],int n)
    {
        for(int i = 0; i < n; ++i)
            cout<<ar[i]<<" ";
        cout<<endl;
    }
    
    static void merge(int ar[], int low, int mid, int high)  
    {  
        int i, k = 0;  
        //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列   
        int *temp = (int *)malloc((high - low + 1)*sizeof(int));   
        int begin1 = low;  
        int end1 = mid;
    
        int begin2 = mid + 1;  
        int end2 = high;   
    
        //比较两个元素,选择相对小的元素放入到合并空间,并移动指针到下一位置   
        for (k = 0; begin1 <= end1 && begin2 <= end2;)    
        {  
            if(ar[begin1] < ar[begin2])  
                temp[k++] = ar[begin1++];  
            else  
                temp[k++] = ar[begin2++];    
        }   
    
        while(begin1 <= end1)  //若第一个序列有剩余,直接拷贝出来粘到合并序列尾   
            temp[k++] = ar[begin1++];  
        while(begin2 <= end2)  //若第二个序列有剩余,直接拷贝出来粘到合并序列尾   
            temp[k++] = ar[begin2++];  
    
        for (i = 0;i < k; i++)   //将排序好的序列拷贝回数组中  
        {
            ar[low+i] = temp[i]; 
        }
    
        free(temp);  
    }  
    void merge_sort(int ar[],int begin,int end)  
    {  
        int mid = 0;  
        if(begin < end)  
        {  
            mid = (begin + end) / 2;
            merge_sort(ar, begin, mid); 
            merge_sort(ar, mid + 1, end);
            merge(ar, begin, mid, end);  
        }  
    }  
    
    void  main()
    {
        int  ar[] = {12, 14, 54, 5, 6, 3, 9, 8, 47, 89};
        merge_sort(ar, 0, MAXSIZE-1);
        PrintArr(ar, MAXSIZE);
    }
    
    /*
    *3 5 6 8 9 12 14 47 54 89
     */

    这里写图片描述

  • 相关阅读:
    第6月第4天 AVMutableComposition AVMutableVideoComposition
    error: WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches
    领导力和管理的区别是什么?
    小企业如何做好员工管理?
    市场营销案例书籍,市场营销必看的书籍推荐
    情商书籍排行榜:这6本书让你更好地做自己
    市场营销原理,看完这本书你才能懂什么叫市场营销
    能帮你提高情商的书籍推荐
    销售人员最该看的书:《销售管理必读12篇》
    适合初学者看的管理类书籍推荐
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160142.html
Copyright © 2011-2022 走看看