排序——歸並排序(遞歸實現+迭代實現 )


 

遞歸實現

//歸並排序  遞歸實現 
#include <iostream>
using namespace std;

#define MAXSIZE 10

// 實現歸並,並把最后的結果存放到 list1里 
void  merging(int *list1, int list1_size , int *list2, int list2_size)
{
    int i , j ,k ,m ;
    int temp[MAXSIZE];
    
    i = j = k = 0;
    
    while( i < list1_size && j < list2_size )
    {
        if( list1[i] < list2[j] )
        {
            temp[k++] = list1[i++];
        }
        else
        {
            temp[k++] = list2[j++];
        }
    }
    
    while( i < list1_size )
    {
        temp[k++] = list1[i++];
    }
    
    while( i < list2_size )
    {
        temp[k++] = list2[j++];
    }
    
    for( m=0; m < (list1_size + list2_size); m++ )
    {
        list1[m] = temp[m]; 
    }
}


void MergeSort( int k[], int n )
{
    if( n > 1)
    {
        int *list1 = k;
        int list1_size = n/2;
        int *list2 = k + n/2;
        int list2_size = n - list1_size; 
        
        MergeSort(list1, list1_size);
        MergeSort(list2, list2_size);
        
        merging(list1, list1_size , list2, list2_size);//歸並
    }
    
}

int main()
{
    int i ,a[10] = {5,2,6,0,3,9,1,7,4,8};
    
    MergeSort(a,10);
    
    for( i=0; i < 10 ;i++ )
    {
        cout << a[i];
    }
    
    cout << endl;
    
    return 0;
}

迭代實現

//歸並排序  迭代實現 
#include <iostream>
#include <stdlib.h>
using namespace std;

#define MAXSIZE 10

void MergeSort( int k[], int n )
{
    int i, left_min, left_max, right_min, right_max;
    
    int *temp = (int *)malloc(n * sizeof(int));
     
    for( i=1; i < n; i*=2 )//步長 
    {
        for( left_min=0; left_min < n-i; left_min = right_max )
        {
            right_min = left_max = left_min + i ;
            right_max = left_max + i;
            
            if( right_max > n ) //不能大於元素的個數  
            {
                right_max = n;
            }
            
            int next = 0;
            
            while( left_min < left_max && right_min < right_max)
            {
                if( k[left_min] < k[right_min] )
                {
                    temp[next++] = k[left_min++];
                }
                else
                {
                    temp[next++] = k[right_min++];
                }
            } 
            
            while( left_min < left_max ) //如果Lmin 沒有走到LMAX的位置 說明L還有元素 
            {
                k[--right_min] = k[--left_min]; //把L的元素放在R的頭部位置 
            }
            
            while( next > 0 )
            {
                k[--right_min] = temp[--next]; //把整個數組還原到 剛剛剩下那個最大元素的后面 
            }
            
        }
    }
}

int main()
{
    int i ,a[10] = {5,2,6,0,3,9,1,7,4,8};
    
    MergeSort(a,10);
    
    for( i=0; i < 10 ;i++ )
    {
        cout << a[i];
    }
    
    cout << endl;
    
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM