• 第四十九课 归并排序和快速排序


     

    归并示意图:

    程序入下:

      1 #ifndef SORT_H
      2 #define SORT_H
      3 
      4 #include "Object.h"
      5 
      6 namespace DTLib
      7 {
      8 
      9 class Sort : public Object
     10 {
     11 private:
     12     Sort();
     13     Sort(const Sort&);
     14     Sort& operator = (const Sort&);
     15 
     16     template <typename T>
     17     static void Swap(T& a, T& b)
     18     {
     19         T c(a);
     20         a = b;
     21         b = c;
     22     }
     23 
     24     template < typename T >
     25     static void Merge(T src[], T helper[], int begin, int mid, int end, bool min2max=true)
     26     {
     27         int i = begin;
     28         int j = mid + 1;
     29         int k = begin;  //代表辅助空间起始位置
     30 
     31         while( (i <= mid) && (j <= end) )
     32         {
     33             if( min2max ? (src[i] < src[j]) : (src[i] > src[j]) )
     34             {
     35                 helper[k++] = src[i++];
     36             }
     37             else
     38             {
     39                 helper[k++] = src[j++];
     40             }
     41         }
     42 
     43         while( i <= mid)
     44         {
     45             helper[k++] = src[i++];
     46         }
     47 
     48         while( j <= end )
     49         {
     50             helper[k++] = src[j++];
     51         }
     52 
     53         for(i = begin; i <= end; i++)
     54         {
     55             src[i] = helper[i];
     56         }
     57     }
     58 
     59     template < typename T >
     60     static void Merge(T src[], T helper[], int begin, int end, bool min2max=true)
     61     {
     62         if( begin < end )
     63         {
     64             int mid = (begin + end) / 2;
     65 
     66             Merge(src, helper, begin, mid, min2max);
     67             Merge(src, helper, mid+1, end, min2max);
     68 
     69             Merge(src, helper, begin, mid, end, min2max); //真正的归并操作
     70         }
     71     }
     72 
     73 public:
     74     template < typename T >
     75     static void Select(T array[], int len, bool min2max=true)
     76     {
     77         for(int i = 0; i < len; i++)
     78         {
     79             int min = i;
     80             for(int j = i + 1; j < len; j++)
     81             {
     82                 if( min2max ? (array[min] > array[j]) : (array[min] < array[j]) )
     83                 {
     84                     min = j;
     85                 }
     86             }
     87 
     88             if( min != i)
     89             {
     90                 Swap(array[i], array[min]);
     91             }
     92         }
     93     }
     94 
     95     template < typename T >
     96     static void Insert(T array[], int len, bool min2max=true)
     97     {
     98         for(int i=1; i < len; i++)  //从1开始,第0个元素没有必要插入操作
     99         {
    100             int k = i;
    101             T e = array[i];
    102 
    103             for(int j=i-1; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j--)
    104             {
    105                 array[j+1] = array[j];
    106                 k = j;
    107             }
    108 
    109             if( k != i )   //赋值比“比较操作耗时”
    110             {
    111                 array[k] = e;
    112             }
    113         }
    114     }
    115 
    116     template < typename T >
    117     static void Bubble(T array[], int len, bool min2max=true)
    118     {
    119         bool exchange = true;
    120 
    121         for(int i=0; (i<len) && exchange; i++)
    122         {
    123             exchange = false;
    124 
    125             for(int j=len-1; j>i; j--)
    126             {
    127                 if(min2max ? (array[j] < array[j-1]) : (array[j] > array[j-1]))
    128                 {
    129                     Swap(array[j], array[j-1]);
    130                     exchange = true;
    131                 }
    132             }
    133         }
    134     }
    135 
    136     template < typename T >
    137     static void Shell(T array[], int len, bool min2max=true)
    138     {
    139         int d = len;
    140         do
    141         {
    142             d = d / 3 + 1; //d的减小方式(实践证明这样做效果比较好)
    143 
    144             for(int i = d; i < len; i+=d)
    145             {
    146                 int k = i;
    147                 T e = array[i];
    148 
    149                 for(int j=i-d; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j-=d)
    150                 {
    151                     array[j+d] = array[j];
    152                     k = j;
    153                 }
    154 
    155                 if( k != i )   //赋值比“比较操作耗时”
    156                 {
    157                     array[k] = e;
    158                 }
    159             }
    160 
    161         }while( d > 1 );
    162     }
    163 
    164     template < typename T >
    165     static void Merge(T array[], int len, bool min2max=true)
    166     {
    167         T* helper = new T[len];
    168 
    169         if( helper != NULL )
    170         {
    171             Merge(array, helper, 0, len - 1, min2max);
    172         }
    173 
    174         delete[] helper;
    175     }
    176 };
    177 
    178 }
    179 
    180 #endif // SORT_H

    注意:归并排序是一种稳定的排序算法

    图解:

    代码如下:

      1 #ifndef SORT_H
      2 #define SORT_H
      3 
      4 #include "Object.h"
      5 
      6 namespace DTLib
      7 {
      8 
      9 class Sort : public Object
     10 {
     11 private:
     12     Sort();
     13     Sort(const Sort&);
     14     Sort& operator = (const Sort&);
     15 
     16     template <typename T>
     17     static void Swap(T& a, T& b)
     18     {
     19         T c(a);
     20         a = b;
     21         b = c;
     22     }
     23 
     24     template < typename T >
     25     static void Merge(T src[], T helper[], int begin, int mid, int end, bool min2max=true)
     26     {
     27         int i = begin;
     28         int j = mid + 1;
     29         int k = begin;  //代表辅助空间起始位置
     30 
     31         while( (i <= mid) && (j <= end) )
     32         {
     33             if( min2max ? (src[i] < src[j]) : (src[i] > src[j]) )
     34             {
     35                 helper[k++] = src[i++];
     36             }
     37             else
     38             {
     39                 helper[k++] = src[j++];
     40             }
     41         }
     42 
     43         while( i <= mid)
     44         {
     45             helper[k++] = src[i++];
     46         }
     47 
     48         while( j <= end )
     49         {
     50             helper[k++] = src[j++];
     51         }
     52 
     53         for(i = begin; i <= end; i++)
     54         {
     55             src[i] = helper[i];
     56         }
     57     }
     58 
     59     template < typename T >
     60     static void Merge(T src[], T helper[], int begin, int end, bool min2max)
     61     {
     62         if( begin < end )
     63         {
     64             int mid = (begin + end) / 2;
     65 
     66             Merge(src, helper, begin, mid, min2max);
     67             Merge(src, helper, mid+1, end, min2max);
     68 
     69             Merge(src, helper, begin, mid, end, min2max); //真正的归并操作
     70         }
     71     }
     72 
     73     template < typename T >
     74     static int Partition(T array[], int begin, int end, bool min2max)
     75     {
     76         T pv = array[begin];
     77 
     78         while( begin < end )
     79         {
     80             while( (begin < end) && (min2max ? (array[end] > pv) : (array[end] < pv)) )
     81             {
     82                 end--;
     83             }
     84 
     85             Swap(array[begin], array[end]);
     86 
     87             while( (begin < end) && (min2max ? (array[begin] <= pv) : (array[begin] >= pv)) )
     88             {
     89                 begin++;
     90             }
     91 
     92             Swap(array[begin], array[end]);
     93         }
     94 
     95         array[begin] = pv;  //基准就位
     96 
     97         return begin;
     98     }
     99 
    100     template < typename T >
    101     static void Quick(T array[], int begin, int end, bool min2max)
    102     {
    103         if( begin < end )
    104         {
    105             int pivot = Partition(array, begin, end, min2max);
    106 
    107             Quick(array, begin, pivot - 1, min2max);
    108             Quick(array, pivot + 1, end, min2max);
    109         }
    110     }
    111 
    112 public:
    113     template < typename T >
    114     static void Select(T array[], int len, bool min2max=true)
    115     {
    116         for(int i = 0; i < len; i++)
    117         {
    118             int min = i;
    119             for(int j = i + 1; j < len; j++)
    120             {
    121                 if( min2max ? (array[min] > array[j]) : (array[min] < array[j]) )
    122                 {
    123                     min = j;
    124                 }
    125             }
    126 
    127             if( min != i)
    128             {
    129                 Swap(array[i], array[min]);
    130             }
    131         }
    132     }
    133 
    134     template < typename T >
    135     static void Insert(T array[], int len, bool min2max=true)
    136     {
    137         for(int i=1; i < len; i++)  //从1开始,第0个元素没有必要插入操作
    138         {
    139             int k = i;
    140             T e = array[i];
    141 
    142             for(int j=i-1; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j--)
    143             {
    144                 array[j+1] = array[j];
    145                 k = j;
    146             }
    147 
    148             if( k != i )   //赋值比“比较操作耗时”
    149             {
    150                 array[k] = e;
    151             }
    152         }
    153     }
    154 
    155     template < typename T >
    156     static void Bubble(T array[], int len, bool min2max=true)
    157     {
    158         bool exchange = true;
    159 
    160         for(int i=0; (i<len) && exchange; i++)
    161         {
    162             exchange = false;
    163 
    164             for(int j=len-1; j>i; j--)
    165             {
    166                 if(min2max ? (array[j] < array[j-1]) : (array[j] > array[j-1]))
    167                 {
    168                     Swap(array[j], array[j-1]);
    169                     exchange = true;
    170                 }
    171             }
    172         }
    173     }
    174 
    175     template < typename T >
    176     static void Shell(T array[], int len, bool min2max=true)
    177     {
    178         int d = len;
    179         do
    180         {
    181             d = d / 3 + 1; //d的减小方式(实践证明这样做效果比较好)
    182 
    183             for(int i = d; i < len; i+=d)
    184             {
    185                 int k = i;
    186                 T e = array[i];
    187 
    188                 for(int j=i-d; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j-=d)
    189                 {
    190                     array[j+d] = array[j];
    191                     k = j;
    192                 }
    193 
    194                 if( k != i )   //赋值比“比较操作耗时”
    195                 {
    196                     array[k] = e;
    197                 }
    198             }
    199 
    200         }while( d > 1 );
    201     }
    202 
    203     template < typename T >
    204     static void Merge(T array[], int len, bool min2max=true)
    205     {
    206         T* helper = new T[len];
    207 
    208         if( helper != NULL )
    209         {
    210             Merge(array, helper, 0, len - 1, min2max);
    211         }
    212 
    213         delete[] helper;
    214     }
    215 
    216     template < typename T >
    217     static void Quick(T array[], int len, bool min2max=true)
    218     {
    219         Quick(array, 0, len - 1, min2max);
    220     }
    221 };
    222 
    223 }
    224 
    225 #endif // SORT_H

     注意:快速排序是一种不稳定的排序算法

    小结:

  • 相关阅读:
    Ubuntu安装deepin wine版QQ
    解决anaconda安装cvxpy失败的方法
    1006
    一种不用参数交换两变量值的方法
    输入三位数,翻转输出
    一个简单的问题
    1006ac(转)
    1007(转)
    杭电oj1004 自写成功代码
    1004
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9688158.html
Copyright © 2020-2023  润新知