ACM_归并排序算法
来源:互联网 发布:cos圈滥交知乎 编辑:程序博客网 时间:2024/05/18 00:22
将数组中的数不断的递归,直到只剩一个数为止(因为一个数自然是有序的),然后再回溯排序(并),另外再用一个数组T存储当前排好序的数,然后再赋值给原数组A,直到所有的数都排好了序。
时间复杂度:nlog2n(最好,最坏,平均)
#include<cstdio>#include<iostream>using namespace std;void merge_sort(int *A,int x,int y,int *T) //A是原数组,x是第一个数的位置,y-x 是数组中元素的个数,T是临时数组{ if (y - x > 1) // y-x=1时,表明此时递归到只剩一个数,自然是有序的,注意这里是if,不是while! { int m = x + (y - x) / 2;//数组中的数尽量均分成两组 int p = x , q = m , i = x;//接下来的while赋值要用到x和m,并且后面的for循环赋值也要用到x,且x,m不能被改变 //所以定义变量表示x和m merge_sort(A,x,m,T);//从左半部分开始递归 merge_sort(A,m,y,T);//从右半部分开始递归,为什么不是m+1呢,因为下面while循环赋值是p<m,左边取不到m //就和右边取不到y一样,有因为y是数组最后一个数位置的下一位,所以,正好! while (p < m || q < y)//p=m,q=y时跳出循环,因为此时A数组已经赋值完毕 { if (q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++]; else T[i++] = A[q++]; }//仔细体会这段并的代码,很巧妙!A数组分为两段(p-m,m-y)两段各自是有序的,然后并到T数组中 for (i = x; i < y; ++i)//从初始位置x,到最后位置,将排好序的数组T赋值给A A[i] = T[i]; } return ;}int main(){ int a[100],b[100],i,n; while (~scanf("%d",&n)) { for (i = 0; i < n; ++i) scanf("%d",&a[i]); merge_sort(a,0,n,b);//是n不是n-1,因为n-0表示数组中元素的个数,n不是表示最后元素的位置 for (i = 0; i < n; ++i) printf("%d ",a[i]); printf("\n"); } return 0;}
0 0
- ACM_归并排序算法
- ACM_快速排序算法
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- Rsync算法的探讨
- POJ2712细菌繁殖
- git和svn的区别
- Matlab---时间
- C++的string实现MFC的CString::GetBuffer
- ACM_归并排序算法
- javascript 切换按钮改变div颜色
- bzoj 2151 种树(贪心+堆)(经典)
- Android Studio安装以及Fetching android sdk component information超时的解决方案
- Android基础_页面布局_RelativeLayout(相对布局)
- 科普:Windows下Netcat使用手册
- 自己收藏的Android开发的知识点各种传送门 持续更新中~~
- 自动化快速实现Parcelable接口序列化
- GRE写作必备句型