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];*/
//最后将temp上放着的合并后的序列 放回到原数组相应位置上
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  ᶜʸᵃⁿ  阅读(27)  评论(0)    收藏  举报