归并排序

题目描述

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

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

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

输入格式

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

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

输出格式

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

数据范围

1n1000001≤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 }

 

posted @ 2019-10-31 10:11  MissLin  阅读(200)  评论(0编辑  收藏  举报