【排序】归并排序
今天,学习一下归并排序
归并排序
首先,在网上找到了一个形象的图。
如图所示,归并排序就是把一堆数拆开拆开再拆开,然后把它合并合并再合并。这就用到了二分法。
拆开这一组数可能不难,但是把它们合并起来的时候就需要用到下面这个方法:
就以图中的两组数:0 4 5 8 和 1 3 7 9来举例
首先需要两个指针i和j,以及一个存放排好序的数列的数组result[]指向每列数的第一个,也就是i->0,j->1,比较它们的大小,因为0<1,所以result[0]=0,之后把i向后挪一位,就指向了4,比较4和1的大小,result[1]=1,再把j向后移……
以此类推,我们就会得到正确的数列了
OK!代码如下:
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int data[1000],result[1000]; 5 void merge_add(int l,int r) 6 { 7 int mid=(l+r)>>1; 8 int left_start=l; 9 int left_end=mid; 10 int right_start=mid+1; 11 int right_end=r; 12 int result_start=l; 13 while(left_start<=left_end&&right_start<=right_end) 14 { 15 if(data[left_start]<data[right_start]) 16 result[result_start++]=data[left_start++]; 17 else result[result_start++]=data[right_start++]; 18 } 19 while(left_start<=left_end) 20 result[result_start++]=data[left_start++]; 21 while(right_start<=right_end) 22 result[result_start++]=data[right_start++]; 23 } 24 void merge(int l,int r) 25 { 26 if(l==r) return; 27 if(r-l==1) 28 { 29 if(data[l]>data[r]) 30 swap(data[l],data[r]); 31 return; 32 } 33 int mid=(l+r)>>1; 34 merge(l,mid); 35 merge(mid+1,r); 36 merge_add(l,r); 37 for(int i=l;i<=r;i++) 38 data[i]=result[i]; 39 } 40 int main() 41 { 42 int n; 43 cin>>n; 44 for(int i=1;i<=n;i++) 45 cin>>data[i]; 46 merge(1,n); 47 for(int i=1;i<=n;i++) 48 cout<<data[i]<<" "; 49 return 0; 50 }