数据结构——归并排序(java)

1.算法思想

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

将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

2.图解

以数组 int[] a = {4,2,3,1}为列,首先看看mergesort方法吧,执行过程如下图,基本就是无限细分,然后组合进行排序。

两数组合并操作(mergearray方法执行过程)

//将有二个有序数列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, m = mid;  //左边(i为first,m为last)
    int j = mid + 1, n = last;  //右边(j为first,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;  
}  

转载:https://blog.csdn.net/middlekingt/article/details/8446552

猜你喜欢

转载自blog.csdn.net/wind_cp/article/details/82926947