由一道面试题想到的关于归并排序的几种写法

View Code
  1 // 搜狐一道题.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 /*********************************
  5 一数组前半部分已经有序,后半部分也有序,先要求在
  6 O(1)的空间下实现对该数组的排序。
  7 
  8 关于归并排序
  9 
 10 1 实现o(1)空间的原地排序算法
 11 
 12 2 实现辅助数组的归并排序算法
 13 
 14 
 15 
 16 
 17 *********************************/
 18 
 19 #include "stdafx.h"
 20 #include <iostream>
 21 using namespace std;
 22 
 23 
 24 
 25 
 26 void MergeSort(int* Arr,int Length)
 27 {
 28     if(!Arr||Length<=0)
 29         return;
 30     int Temp=0;
 31     for(int i=Length>>1;i<Length;i++)
 32     {
 33         Temp=Arr[i];
 34         for(int j=i-(Length>>1);j<i;j++)
 35         {
 36             if(Arr[j]>Arr[i])
 37             {
 38                 while(j<i)    //{1,2,3,4,8,5,7,9,12,32,34};  
 39                 {
 40                     Arr[i]=Arr[i-1];
 41                     i--;
 42                 }
 43                 Arr[j]=Temp;
 44             }
 45         }
 46     }
 47     for(int k=0;k<Length;k++)
 48         cout<<Arr[k]<<" ";
 49     cout<<endl;
 50 }
 51 
 52 
 53 template <typename T>
 54 void Swap(T& t1,T& t2)
 55 {
 56     T t=t1;
 57     t1=t2;
 58     t2=t;
 59 }
 60 
 61 template <typename T>
 62 void Reverse(T* Arr,size_t size)
 63 {
 64     if(!Arr) return;
 65     size_t b=0,e=size-1;
 66     while(b<e&&b<size&&e>0)
 67     {
 68         Swap(Arr[b++],Arr[e--]);
 69     }
 70 }
 71 
 72 
 73 template<typename T>
 74 void Exchange(T* Arr,size_t size,size_t n)
 75 {
 76     if(!Arr) return;
 77     Reverse(Arr,n);
 78     Reverse(Arr+n,size-n);
 79     Reverse(Arr,size);
 80 }
 81 
 82 
 83 template <typename T>
 84 void Merge(T* Arr,size_t Size,size_t Pos)
 85 {
 86      size_t First=0,Second=Pos;
 87      while(First<Second&&Second<Size)
 88      {
 89          while(Arr[First]<=Arr[Second]&&First<Second) First++;
 90          size_t MaxMove=0;
 91          while(Arr[First]>Arr[Second]&&Second<Size) MaxMove++,Second++;
 92          Exchange(&Arr[First],Second-First,Second-First-MaxMove);
 93          First+=MaxMove;
 94      }
 95 }
 96 
 97 template <typename T>
 98 void display(T* Arr, size_t n)
 99 {
100      if(!Arr) return ;
101      for (size_t i = 0; i < n; ++i)
102      {
103          printf("%d  ", Arr[i]);
104      }
105      printf("\n");
106 }
107 
108 template<typename T>
109 void MergeSort( T* Arr, size_t size )
110 {
111     if ( size <= 1 ) return;
112     MergeSort( Arr, size/2 );
113     MergeSort( Arr+size/2,size-size/2 );
114     Merge( Arr, size, size/2 );
115 }
116 
117 
118 
119 
120 
121 void Merge_Sort(int* Arr,int x,int y,int* T)
122 {
123     if(y-x>1)
124     {
125         int m=x+((y-x)>>1);
126         int p=x,q=m,i=x;
127         Merge_Sort(Arr,x,m,T);
128         Merge_Sort(Arr,m,y,T);
129         while(p<m||q<y)
130         {
131             if(q>=y||(p<m&&Arr[p]<=Arr[q]))
132                 T[i++]=Arr[p++];
133             else
134                 T[i++]=Arr[q++];
135         }
136         for(i=x;i<y;i++) 
137             Arr[i]=T[i];
138     }
139 }
140 
141 
142 void Test2()
143 {
144     int arr[] = {3,5,7,8,1,2,4,6};
145     int brr[8];
146     display(arr,sizeof(arr)/sizeof(int));
147     Merge_Sort(arr,0,8,brr);
148     display(arr, sizeof(arr)/sizeof(int));
149 }
150 
151 void Test1()
152 {
153     int arr[] = {3,5,7,8,1,2,4,6};
154     display(arr,sizeof(arr)/sizeof(int));
155     MergeSort(arr,sizeof(arr)/sizeof(int));
156     display(arr, sizeof(arr)/sizeof(int));
157 }
158 int main()  
159 {  
160     int a[11]={1,2,3,4,8,5,6,7,12,32,34};  
161     MergeSort(a,11);
162     for(int k=0;k<11;k++)  
163         cout<<a[k]<<" ";  
164     cout<<endl;
165     cout<<"Test1 have Begun!"<<endl;
166     Test1();
167     cout<<"Test2 have Begun!"<<endl;
168     Test2();
169     return 0;  
170 }  
原文地址:https://www.cnblogs.com/cslave/p/2582415.html