归并排序

归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略将问题分成一些小的问题然后递归求解,即分而治之。


假如一个数组为下所示:

2 1 3 7 5 4

归并算法先将数组二分:

2 1 3

 

7 5 4

之后通过递归再将每部分二分,直到无法再分。

之后递归会回溯,利用第二个数组将每部分元素排序。

代码如下:

#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int arr[N];
int tem[N];

void merge_sort(int l, int r)
{
    if (l >= r) return ;
    int mid = l + r >> 1;
    merge_sort(l, mid), merge_sort(mid + 1, r);//二分,利用递归将两部分排序

    int i = l, j = mid + 1, k = 0;
    while (i <= mid && j <= r)//利用第二个数组tem,将两部分排序,这个代码是按顺序排列
    {
        if(arr[i] <= arr[j]) tem[k ++] = arr[i ++];//谁小谁排在前面
        else tem[k ++] = arr[j ++];
    }
    while (i <= mid) tem[k ++] = arr[i ++];//将未排完的元素放入tem数组中,下同
    while (j <= r) tem[k ++] = arr[j ++];
    for (i = l, j = 0; i <= r; i++, j++) arr[i] = tem[j];//将tem排好的元素还给arr数组
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)//输入数组
        cin >> arr[i];
  
    merge_sort(0, n - 1);
  
    for (int i = 0; i < n; i++)//输出数组
        cout << arr[i] << " ";
    return 0;
}
posted @ 2021-12-09 13:01  ora12321  阅读(13)  评论(0)    收藏  举报