归并排序
题目描述
将读入的 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]; }
感觉边界条件要特别注意,调试了很久