MergeSort(合并排序)

mergeSort的关键是 merge。但是一个数组怎么来merge?所以,它是分两步走的,首先它要把所给的数组分割开来,然后对分割开来的子数组进行合并。之前我们讲过快排也要分割数组,但是这里的分割数组相对简单。重点是如何将分割开来的数组合并起来

 先上图,看图比较容易理解:

MergeSort过程分析

经过我们的演示可以发现,我们的合并是沿着当初分割的原路合并的,在合并的时候将元素的大小顺序排好

  1. 将数组从中间分开得到新的两子数组,对子数组重复进行分割操作,直至子数组足够小(数组大小为1)。然后原路合并操作。
  2. 当需要合并的两个子数组都只有一个元素时,比较大小,谁小谁在前,谁大谁在后,合并成一个新的数组
  3. 当需要合并的两个子数组元素大于1 时,
  • 假如两个子数组为left[i] , right[j]
  • 先使用两个数组的第一个元素比较大小,例如left[0]和right[0]比较大小,如果left[0]<=right[0],则在组成新数组时,left[0]为新数组的第一个元素;right[0]再和left[1]比较大小。如此进行下去
  • 如过left[] 的元素已经全部假如新的数组,而right[]还没有全部假如新数组,则之间将right[]的剩余元素按其本身的顺序关系添加到新数组后面即可
  •  

    4.重复合并操作,直至重新生成的数组和数组大小一样,MergeSort结束。

代码演示

#include <stdio.h>
#include <iostream>

using namespace std;
void merge(int arr[], int left,int mid, int right){
    int size_l = mid-left+1;
    int size_r = right- mid;

    int subArrLeft[size_l],subArrRight[size_r];

    for(int index = 0;index < size_l;index++){
        subArrLeft[index] = arr[left + index];
    }

    for(int index = 0;index < size_r;index++){
        subArrRight[index] = arr[mid + 1 + index];
    }

    int i = 0, j = 0;
    int k = left;
    // 按顺序合并两个子数组
    while (i < size_l &&  j < size_r)
    {
        if(subArrLeft[i]<=subArrRight[j]){
            arr[k] = subArrLeft[i];
            i++;
        }else{
            arr[k] = subArrRight[j];
            j++;
        }
        k++;
    }

    // 如果比较的连个子数组中一个已经为空,另一个还有剩余元素,则直接追加到合并数组的后面
    while (i < size_l)
    {
        arr[k] = subArrLeft[i];
        i++;
        k++;
    }
    while (j < size_r)
    {
        arr[k] = subArrRight[j];
        j++;
        k++;
    }
}

void mergeSort(int arr[], int left, int right){
    if(left < right){
        int mid = left +(right -left)/2;
        mergeSort(arr,left,mid);  // 对左半边数组做合并排序
        mergeSort(arr,mid+1,right);  // 对右半边数组做合并排序
        merge(arr,left,mid,right);  // 对分开的数组进行合并操作
    }
}


void printArray(int arr[], int size) {
    int i;
    for (i = 0; i < size; i++) cout << arr[i] << " ";
    cout << endl;
}
int main()
{
	int arr[] = {10, 7, 82, 9, 13, 5, 2, 34, 54, 3, 26, 6, 37, 6, 48, 11};
	int arrSize = sizeof(arr)/sizeof(arr[0]);

    cout << "perpare sort array is "<<endl;
	printArray(arr, arrSize);

	mergeSort(arr, 0, arrSize - 1);

	cout<<"MergeSorted array is "<<endl;
	printArray(arr, arrSize);
	return 0;
}

代码关键就在merge()函数.

运行结果

发布了41 篇原创文章 · 获赞 35 · 访问量 4331

猜你喜欢

转载自blog.csdn.net/weixin_38140931/article/details/102500337