uacs2024

导航

归并排序

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 ,为你需要进行排序的数。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入 #1

5
4 2 4 5 1

输出 #1

1 2 4 4 5

说明/提示

 

一、递归法

#include<iostream>
using namespace std;

void merge(int left,int mid,int right,int num[]){
    //注意,mid只是这部分序列的中间位置,不代表中间位置上的值就是中间值
    int temp[right-left+1];
    int i = left;
    int j = mid+1;
    int p = 0;
    while(i <= mid && j <= right){
    //当指针i指向到mid或指针j指向到最右边,循环还没有结束
        if(num[i] < num[j]){
            temp[p++] = num[i++];
        }
        else{//  num[i] >= num[j]
            temp[p++] = num[j++];
        }
    }
    //指针i或者j只要任一个越界了,都不会执行后续的复制操作,所以不需要用if来判断
    while(i <= mid)  temp[p++] = num[i++];
    while(j <= right)  temp[p++] = num[j++];

    /*for(int m = left, n = 0; m <= right; m++, n++)
        num[m] = temp[n];*/
    for(int n = 0;n <= (right-left);n++)  num[left+n] = temp[n];
}

void mergeSort(int left,int right,int num[]){
    if(left >= right) return;
    int mid = (left+right)/2;
    //注意,mid只是这部分序列的中间位置,不代表中间位置上的值就是中间值
    mergeSort(left,mid,num);
    mergeSort(mid+1,right,num);
    merge(left,mid,right,num);
}

int main(){
    int n;
    cin >> n;
    int num[n];
    for (int i = 0; i < n; i++)  cin >> num[i];

    mergeSort(0,n-1,num);

    for (int i = 0; i < n - 1; i++)  cout << num[i] << " ";
    cout << num[n-1];
}            

感觉边界条件要特别注意,调试了很久

posted on 2024-11-08 20:41  ᶜʸᵃⁿ  阅读(5)  评论(0编辑  收藏  举报