Fork me on GitHub

早期人肉实现 - 简单排序算法代码

包括MergeSort, QuickSort, 包括数组和链表的实现

  1// SortAlgorithm.cpp : Defines the entry point for the console application.
  2//
  3
  4#include "stdafx.h"
  5#include <iostream>
  6#include <time.h> 
  7#include "CProTimer.h"
  8
  9using namespace std;
 10const int nSize = 500000 ;
 11 
 12// MergeSort
 13void MergeSort( int nlow, int nhigh);
 14void Merge( int nlow, int nmid, int nhigh);
 15int A[nSize];
 16int B[nSize]; // temp array
 17
 18// MergeSortL
 19int MergeSortL( int low, int high);//, int p
 20int MergeL( int q, int r );//返回int p
 21int InsertSortL( int low, int high);//, int p
 22int AL[nSize+1];  //比较特殊,第0个不用
 23int Link[nSize+1]; // linked list
 24
 25//QuickSort
 26int Partition( int m, int p);
 27void QuickSort( int p, int q);
 28int Aq[nSize];
 29void InsertSort(int p,int q);
 30
 31int _tmain(int argc, _TCHAR* argv[])
 32{
 33    srand( (unsigned)time( NULL ) );
 34    for (int i=1; i<nSize+1; i++)
 35    {
 36        AL[i] = (int)rand() ;
 37        Link[i]=i+1;
 38
 39        Aq[i-1= AL[i];
 40     }

 41    Link[0]=1;
 42    Link[nSize]=0;    
 43    //MergeSort( 0, nSize-1);
 44
 45    // Aq[3]=Aq[0];
 46    //for (int i=0; i<nSize; i++)
 47    //{
 48    //    cout<< Aq[i] << " ";
 49
 50    //}
 51    cout<< endl;
 52
 53//    int s1=CTime::GetCurrentTime(); 
 54    //int e1=CTime::GetCurrentTime();
 55
 56    CProTimer  proTimer;
 57    proTimer.Reset();
 58    MergeSortL(1,nSize);
 59    float f=proTimer.GetTimeMicro(TRUE);
 60    cout<<"MergeSort: "<<nSize<<"个耗时(Microsecond): "<< f <<endl;
 61
 62//    s1=GetTickCount();
 63    proTimer.Reset();
 64    QuickSort(0,nSize-1) ;
 65//    e1=GetTickCount();
 66    f=proTimer.GetTimeMicro(TRUE);
 67    cout<<"QuickSort: "<<nSize<<"个耗时(Microsecond): "<< f << endl;
 68
 69    //for (int i=0; i<nSize; i++)
 70    //{
 71 //
 72    //    cout<< Aq[i]  << " ";
 73
 74    //}
 75    //cout<<endl<<"quicksort data:"<<endl;
 76    //int i=0;
 77    //while (1)
 78    //{
 79    //    int temp=AL[i];
 80    //    i=Link[i];
 81    //    if (i==0)
 82    //    {
 83    //        break;
 84    //    }
 85    //    cout<<AL[i]<<" ";
 86    //}
 87
 88    ;
 89    //for (int i=0; i<(nSize-1); i++)
 90    //{
 91    //    cout<< (Aq[i+1]-Aq[i]) << " ";
 92    //    if ((Aq[i+1]-Aq[i])<0)
 93    //    {
 94    //        cout<<endl<<"*****"<<endl;
 95    //    }
 96    //     
 97    //}
 98 
 99    return 0;
100}

101
102void MergeSort( int nlow, int nhigh)
103{
104    if ( nlow < nhigh )
105    {
106            int nmid = ( nlow + nhigh ) / 2;
107     
108            MergeSort( nlow, nmid);
109     
110     
111            MergeSort( (nmid+1) , nhigh);
112         
113            Merge( nlow, nmid, nhigh );
114    }

115}

116
117void Merge( int nlow, int nmid, int nhigh )
118{
119    int h, i, j, k;
120    // 
121    h = nlow; i = nlow; j = nmid +1;
122
123    while ( h <= nmid && j <= nhigh)
124    {
125        if ( A[h] <= A[j] )
126        {
127            B[i++= A[h++];
128             
129        }

130        else
131        {
132            B[i++= A[j++]; 
133        }
 
134    }

135
136    //while (j <=nhigh)
137    //{
138    //    B[i++]=A[j++];
139    //}
140    //while (h <=nmid)
141    //{
142    //    B[i++]=A[h++];
143    //}
144    if( h > nmid)
145        for ( k= j; k <=nhigh; k ++)
146        {
147            B[i]=A[k];
148            ++i;
149        }

150    else
151        for (k = h; k <=nmid; k ++)
152        {
153            B[i]=A[k];
154            ++i;
155        }

156    
157    for ( k = nlow; k <=nhigh; k ++)
158    {
159        A[k] = B[k];
160    }

161
162}

163
164// MergeSortL
165int MergeSortL(int low, int high)
166{
167    if ( high - low < 10)
168    {
169        return InsertSortL(low,high);
170    }

171    else
172    {
173        int mid = (low+high)/2;
174        int q=MergeSortL(low, mid);
175        int r=MergeSortL(mid+1,high);
176        return MergeL(q,r);
177    }

178}

179int MergeL( int q, int r)
180{
181    int i=q,j=r,k=0;
182    while (i!=0&&j!=0)
183    {
184        if (AL[i] <= AL[j])
185        {
186            Link[k]=i;
187            k=i;
188            i=Link[i];
189        }

190        else
191        {
192            Link[k]=j;
193            k=j;
194            j=Link[j];
195        }

196
197    }

198        if (i==0)
199        {
200            Link[k]=j;
201        }

202        else
203            Link[k]=i;
204
205        return Link[0];
206
207}

208int InsertSortL( int low, int high)
209{
210    for (int i=low;i<=high;i++)
211    {
212        for (int j=i;j<=high;j++)
213        {
214            if (AL[j]<AL[i])
215            {
216                int temp = AL[i];
217                AL[i]=AL[j];
218                AL[j]=temp;
219            }

220        }

221    }

222    Link[high]=0;
223    return low;    
224}

225
226// Quick Sort
227int Partition(int m, int p)
228{
229    int i;
230    int v = Aq[m]; 
231    int t1=m,t2=p;
232    int v1=Aq[p],v2=Aq[(m+p)/2];  //选择首,中,尾三个数中的中间值
233    if ((v-v1)*(v-v2)>0)
234    {
235        if (v>v1)
236        {
237            if (v1>v2)
238            {
239                Aq[m]=v1;
240                Aq[p]=v;
241                v=v1;
242            }

243            else
244            {
245                Aq[m]=v2;
246                Aq[(m+p)/2]=v;
247                v=v2;
248            }

249        }

250        else
251        {
252            if (v1<v2)
253            {
254                Aq[m]=v1;
255                Aq[p]=v;
256                v=v1;
257            }

258            else
259            {
260                Aq[m]=v2;
261                Aq[(m+p)/2]=v;
262                v=v2;
263            }

264
265        }

266    }

267    
268    i=m;
269    //p=p-1;
270    while (1)
271    {
272         while (Aq[i]<=v)
273        
274             i++;
275        }

276        while (Aq[p]>=v&&p>m)
277        
278             p--;
279        }

280        if ( i < p)
281        {             
282             int temp = Aq[i];
283             Aq[i]=Aq[p];
284             Aq[p]=temp;             
285        }

286        else
287            break;
288
289    }

290
291    if (p<0)
292    {
293        cout<<"";
294    }

295     Aq[m]=Aq[p]; Aq[p]=v;
296    return p;
297
298}

299
300void QuickSort( int p, int q)
301{
302    if (q>p)
303    {
304        if ((q-p)<10)
305        {
306            InsertSort(p,q);
307        }

308        else
309        {
310            int x=Partition(p,q);
311            QuickSort(p,x-1);
312            QuickSort(x+1,q);
313        }

314
315    }

316}

317
318void InsertSort(int p,int q)
319{
320    for (int i=p;i<=q;i++)
321    {
322        for (int j=i;j<=q;j++)
323        {
324            if (Aq[j]<Aq[i])
325            {
326                int temp = Aq[i];
327                Aq[i]=Aq[j];
328                Aq[j]=temp;
329            }

330        }

331    }

332}

 

posted @ 2008-03-03 22:37  小狮子  阅读(322)  评论(0编辑  收藏  举报