归并排序
题目描述
给定你一个长度为n的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
排序思想:
1.确定分界点。mid=(l+r)/2
2.递归排序left right
3.归并---合二为一:(双指针),把较小的数添加到临时数组中
4.赋值临时数组中的有序元素到原来的数组。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=100010; 4 int q[N],tmp[N]; 5 void merge_sort(int q[],int l,int r) 6 { 7 if(l>=r) return; //如果只有一个数,或没有数,返回 8 int mid=l+r>>1; 9 merge_sort(q,l,mid); 10 merge_sort(q,mid+1,r); 11 int k=0,i=l,j=mid+1; //采用双指针,一个指向左边,一个指向右边,不断把较小的数加入临时数组 12 while(i<=mid &&j<=r) 13 if(q[i]<=q[j]) 14 tmp[k++]=q[i++]; 15 else 16 tmp[k++]=q[j++]; 17 while(i<=mid) tmp[k++]=q[i++]; //将剩余的数一起添加到临时数组右侧 18 while(j<=r) tmp[k++]=q[j++]; 19 for(int i=l,j=0;i<=r;i++,j++) //将临时数组中的有序数复制到原来的q数组 20 q[i]=tmp[j]; 21 } 22 int main(){ 23 int n; 24 cin>>n; 25 for(int i=0;i<n;i++) 26 scanf("%d",&q[i]); 27 merge_sort(q,0,n-1); 28 for(int i=0;i<n;i++) 29 printf("%d ",q[i]); 30 return 0; 31 }