归并排序算法实现的个人理解

归并排序算法递归实现的个人理解


递归与非递归两种实现方案(使用C++实现)


首先介绍一下归并排序实现的基本思路
1.将数组array[n]对半划分,依次进行下去,直至得到n/2个子数组
2.对这n/2个数组依次进行排序
3.继续将数组进行划分,得到n/4个数组,由于之前的n/2个子数组已经排序完成,所以实际上是将上面的n/2个数组合并成排序完成的n/4个数组,并排序,依次类推至最终得到的n/n(即1)个数组则为排序完成的数组


代码实现如下:
首先介绍将子数组进行合并排序的函数

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++];  
    }  
//将剩下的元素赋值给temp
    while (j <= n)  
        temp[k++] = a[j++];  

    while (i <= m)  
        temp[k++] = a[i++];  
//将排序成功的temp数组里面的值赋值给原数组
    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); //再将二个有序数列合并  
    }  
}  

非递归实现

void MergeSort(int a[],int n){
    int* temp = new int(n);
    int size = 1,first,mid;//size为每次子数组的大小/2 
    while(size<n){
        first=0;
        while(first+size<n){
            mid = first+size-1;//得到每次要归并的数组的中间下标
            //归并数组的最后一个下标若超过数组大小则按n-1处理
            mergesort(a,first,mid+size>n-1?n-1:mid+size,temp);
            cout<<"first:"<<first<<" mid:"<<mid<<" last:"<<(mid+size>n-1?n-1:mid+size)<<endl;//打印出每次归并的区间   
            first = mid+size+1;
        }
        size*=2;
    }
}

猜你喜欢

转载自blog.csdn.net/madonghyu/article/details/79950323