文章目录

  • Question
  • Ideas
  • Code


Question

给定你一个长度为 n
的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n

第二行包含 n
个整数(所有整数均在 1∼109
范围内),表示整个数列。

输出格式
输出共一行,包含 n
个整数,表示排好序的数列。

数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

Ideas

  • 归并排序,寻找小的放入辅助数组中,最后记得将辅助数组中的值迁移到原数组。

Code

#include <iostream>

using namespace std;
const int N = 1e5 + 10;
int q[N],tem[N];

void merge_sort(int q[], int l, int r)
{
    if (l >= r) return;
    
    int mid = l + r >> 1;
    
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
    
    int i = l, j = mid + 1, k = 0;
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j]) tem[k ++] = q[i ++];
        else tem[k ++] = q[j ++];
    }
    while(i <= mid) tem[k ++] = q[i ++];
    while(j <= r) tem[k ++] = q[j ++];
    
    for (int i = 0; i < k; i ++)
        q[l++] = tem[i];
}

int main()
{
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i ++) scanf("%d", &q[i]);
    
    merge_sort(q, 0, n - 1);
    
    for (int i = 0; i < n; i ++) printf("%d ", q[i]);
    
    return 0;
}
def merge_sort(q, l, r):
    if l >= r: return
    
    mid = l + r >> 1
    
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r)
    
    i, j = l, mid + 1
    tem = []
    while i <= mid and j <= r:
        if q[i] <= q[j]:
            tem.append(q[i])
            i += 1
        else:
            tem.append(q[j])
            j += 1
    
    while i <= mid:
        tem.append(q[i])
        i += 1
    while j <= r:
        tem.append(q[j])
        j += 1
        
    q[l: r + 1] = tem
    
if __name__ == "__main__":
    n = int(input())
    q = list(map(int,input().strip().split()))
    
    merge_sort(q, 0, n - 1)
    
    for i in q:
        print(i, end=' ')

787. 归并排序(C++和Python3)——2023.5.1打卡_算法