归并排序

时间:2019-10-31
本文章向大家介绍归并排序,主要包括归并排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

排序思想:

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 }

原文地址:https://www.cnblogs.com/pythen/p/11769490.html