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


    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 }  
  • 相关阅读:
    DataTablez转List对象效率慢的问题.
    Oracle 删除重复数据
    1.layui 添加旋转等待, 2.div里面加载HTML页面
    layui-table JSON.stringify()序列化出来的不同行数据类型错误.导致后台转成表格的时候出错.(常用)
    0基础学MVC课程
    构造函数的执行顺序
    html控件自动点 “加号”添加 多个附件
    C#委托之个人理解 转自 loose_went
    一步一步学Linq to sql系列文章 转lovecherry
    使用AOP 使C#代码更清晰 转yanghua_kobe
  • 原文地址:https://www.cnblogs.com/cslave/p/2582415.html
Copyright © 2020-2023  润新知