• 第四十八课 冒泡排序和希尔排序


    Exchang是一个标记,比较一遍的时候如果没有发生任何交换就可以结束了。

    冒泡排序就是模拟泡泡从湖底到湖面的过程。

    添加冒泡排序:

     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 public:
    25     template < typename T >
    26     static void Select(T array[], int len, bool min2max=true)
    27     {
    28         for(int i = 0; i < len; i++)
    29         {
    30             int min = i;
    31             for(int j = i + 1; j < len; j++)
    32             {
    33                 if( min2max ? (array[min] > array[j]) : (array[min] < array[j]) )
    34                 {
    35                     min = j;
    36                 }
    37             }
    38 
    39             if( min != i)
    40             {
    41                 Swap(array[i], array[min]);
    42             }
    43         }
    44     }
    45 
    46     template < typename T >
    47     static void Insert(T array[], int len, bool min2max=true)
    48     {
    49         for(int i=1; i < len; i++)  //从1开始,第0个元素没有必要插入操作
    50         {
    51             int k = i;
    52             T e = array[i];
    53 
    54             for(int j=i-1; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j--)
    55             {
    56                 array[j+1] = array[j];
    57                 k = j;
    58             }
    59 
    60             if( k != i )   //赋值比“比较操作耗时”
    61             {
    62                 array[k] = e;
    63             }
    64         }
    65     }
    66 
    67     template < typename T >
    68     static void Bubble(T array[], int len, bool min2max=true)
    69     {
    70         bool exchange = true;
    71 
    72         for(int i=0; (i<len) && exchange; i++)
    73         {
    74             exchange = false;
    75 
    76             for(int j=len-1; j>i; j--)
    77             {
    78                 if(min2max ? (array[j] < array[j-1]) : (array[j] > array[j-1]))
    79                 {
    80                     Swap(array[j], array[j-1]);
    81                     exchange = true;
    82                 }
    83             }
    84         }
    85     }
    86 
    87 
    88 };
    89 
    90 }
    91 
    92 #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 public:
     25     template < typename T >
     26     static void Select(T array[], int len, bool min2max=true)
     27     {
     28         for(int i = 0; i < len; i++)
     29         {
     30             int min = i;
     31             for(int j = i + 1; j < len; j++)
     32             {
     33                 if( min2max ? (array[min] > array[j]) : (array[min] < array[j]) )
     34                 {
     35                     min = j;
     36                 }
     37             }
     38 
     39             if( min != i)
     40             {
     41                 Swap(array[i], array[min]);
     42             }
     43         }
     44     }
     45 
     46     template < typename T >
     47     static void Insert(T array[], int len, bool min2max=true)
     48     {
     49         for(int i=1; i < len; i++)  //从1开始,第0个元素没有必要插入操作
     50         {
     51             int k = i;
     52             T e = array[i];
     53 
     54             for(int j=i-1; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j--)
     55             {
     56                 array[j+1] = array[j];
     57                 k = j;
     58             }
     59 
     60             if( k != i )   //赋值比“比较操作耗时”
     61             {
     62                 array[k] = e;
     63             }
     64         }
     65     }
     66 
     67     template < typename T >
     68     static void Bubble(T array[], int len, bool min2max=true)
     69     {
     70         bool exchange = true;
     71 
     72         for(int i=0; (i<len) && exchange; i++)
     73         {
     74             exchange = false;
     75 
     76             for(int j=len-1; j>i; j--)
     77             {
     78                 if(min2max ? (array[j] < array[j-1]) : (array[j] > array[j-1]))
     79                 {
     80                     Swap(array[j], array[j-1]);
     81                     exchange = true;
     82                 }
     83             }
     84         }
     85     }
     86 
     87     template < typename T >
     88     static void Shell(T array[], int len, bool min2max=true)
     89     {
     90         int d = len;
     91         do
     92         {
     93             d = d / 3 + 1; //d的减小方式(实践证明这样做效果比较好)
     94 
     95             for(int i = d; i < len; i+=d)
     96             {
     97                 int k = i;
     98                 T e = array[i];
     99 
    100                 for(int j=i-d; (j>=0) && (min2max ? (array[j] > e) : (array[j] < e)); j-=d)
    101                 {
    102                     array[j+d] = array[j];
    103                     k = j;
    104                 }
    105 
    106                 if( k != i )   //赋值比“比较操作耗时”
    107                 {
    108                     array[k] = e;
    109                 }
    110             }
    111 
    112         }while( d > 1 );
    113     }
    114 };
    115 
    116 }
    117 
    118 #endif // SORT_H

    注意:希尔排序是不稳定的

     希尔排序使用了插入排序作为基本的排序法。

    划分分组后,也可以使用冒泡排序作为基本的排序。

    小结:

  • 相关阅读:
    C++ 虚成员函数和动态联编
    C++ 多态公有继承
    C++ 继承特性
    C++ 公有派生
    C++ 基类与派生类
    C++ 类继承
    C++ 伪私有方法
    C++ new失败
    mysql用户授权
    linux时间设置
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9683869.html
Copyright © 2020-2023  润新知