【插入排序】直接,折半,二路,希尔

来源:互联网 发布:流星网络电视app 编辑:程序博客网 时间:2024/05/15 12:05

插入排序 给出一下四种方法:


直接插入排序,折半插入排序,二路插入排序,希尔插入排序



代码实现:


[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3. #define size 21  
  4.   
  5. typedef int Sqlist[size];  
  6.   
  7. void SInsertSort(Sqlist &L, int n)  //直接插入  
  8. {  
  9.     cout << "直接插入排序" << endl;  
  10.   
  11.     for (int i = 2; i < n; ++i)  
  12.     {  
  13.         if (L[i] < L[i - 1])     //判断i与i-1位置的大小  
  14.         {  
  15.             L[0] = L[i];            //将i位置赋值给哨兵位  
  16.   
  17.             int j;  
  18.             for (j = i - 1; L[0] < L[j]; --j)  
  19.             {  
  20.                 L[j + 1] = L[j];        //循环后移  
  21.             }  
  22.             L[j + 1] = L[0];  
  23.         }  
  24.     }  
  25. }  
  26.   
  27.   
  28. void BInsertSort(Sqlist &L, int n)  
  29. {  
  30.     cout << "折半插入排序" << endl;  
  31.     for (int i = 2; i < n; ++i)  
  32.     {  
  33.         L[0] = L[i];  
  34.   
  35.         int low = 1;  
  36.         int high = i - 1;  
  37.         int mid = 0;  
  38.   
  39.         while (low <= high)  
  40.         {  
  41.             mid = (low + high) / 2;  
  42.   
  43.             if (L[0] < L[mid])  
  44.             {  
  45.                 high = mid - 1;  
  46.             }  
  47.             else  
  48.             {  
  49.                 low = mid + 1;  
  50.             }  
  51.         }  
  52.   
  53.         for (int j = i - 1; j >= high + 1; --j)  
  54.         {  
  55.             L[j + 1] = L[j];                //循环后移  
  56.         }  
  57.         L[high + 1] = L[0];  
  58.     }  
  59. }  
  60.   
  61.   
  62. void TWInsertSort(Sqlist &L, int n)         //2—路插入排序  
  63. {  
  64.     cout << "二路插入排序" << endl;  
  65.   
  66.     Sqlist T;  
  67.     T[0] = L[0];  
  68.     int first;  
  69.     int last;  
  70.     first = last = 0;  
  71.     for (int i = 1; i < n; ++i)  
  72.     {  
  73.         if (L[i] < T[first])  
  74.         {  
  75.             first = (first - 1 + n) % n;  
  76.             T[first] = L[i];  
  77.         }  
  78.         else if (L[i] > T[last])  
  79.         {  
  80.             last++;  
  81.             T[last] = L[i];  
  82.         }  
  83.         else  
  84.         {  
  85.             last++;  
  86.             T[last] = T[last - 1];  
  87.   
  88.             int j = last - 1;  
  89.             for (; L[i] < T[(j - 1 + n) % n]; j = (j - 1 + n) % n)  
  90.             {  
  91.                 T[j] = T[(j - 1 + n) % n];  
  92.             }  
  93.             T[j] = L[i];  
  94.         }  
  95.     }  
  96.     for (int i = 0; i < n; ++i)  
  97.     {  
  98.         L[i] = T[first];  
  99.         first = (first + 1) % n;  
  100.     }  
  101. }  
  102.   
  103.   
  104.   
  105.   
  106. void ShellInsert(Sqlist &L, int n, int dk)//希尔插入    
  107. {  
  108.     int t;  
  109.     for (int i = dk + 1; i <= n; ++i)         //按增量变化    
  110.     {  
  111.         if (L[i] < L[i - dk])              //比较大小    
  112.         {  
  113.               
  114.             t = L[i];  
  115.             int j = i - dk;  
  116.             for (; j>0 && t<L[j]; j -= dk)    
  117.             {  
  118.                 L[j + dk] = L[j];  
  119.             }  
  120.             L[j + dk] = t;             //赋值    
  121.         }  
  122.     }  
  123. }  
  124.   
  125. void ShellSort(Sqlist &L, int n, int dlta[], int t)//希尔排序    
  126. {  
  127.     for (int k = 0; k < t; ++k)                    //按照增量数组值重复插入排序    
  128.     {  
  129.         ShellInsert(L, n, dlta[k]);  
  130.     }  
  131. }  
  132.   
  133.   
  134. void main()  
  135. {  
  136.     Sqlist sq = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//0为哨兵位  
  137.       
  138.       
  139.     cout << "原数组为:" << endl;  
  140.     for (int i = 1; i < 9; ++i)  
  141.     {  
  142.         cout << sq[i]<<' ';  
  143.     }  
  144.     cout << endl;  
  145.   
  146.   
  147.     SInsertSort(sq,9);  
  148.   
  149.     for (int i = 1; i < 9; ++i)  
  150.     {  
  151.         cout << sq[i] << ' ';  
  152.     }  
  153.     cout << endl;  
  154.   
  155.     BInsertSort(sq, 9);  
  156.       
  157.     for (int i = 1; i < 9; ++i)  
  158.     {  
  159.         cout << sq[i] << ' ';  
  160.     }  
  161.     cout << endl;  
  162.   
  163.   
  164.     Sqlist Sq = { 49, 38, 65, 97, 76, 13, 27, 49 };  
  165.       
  166.     cout << "原数组为:" << endl;  
  167.     for (int i = 0; i < 8; ++i)  
  168.     {  
  169.         cout << Sq[i]<<' ';  
  170.     }  
  171.     cout << endl;  
  172.       
  173.     TWInsertSort(Sq, 8);  
  174.   
  175.     for (int i = 0; i < 8; ++i)  
  176.     {  
  177.         cout << Sq[i] << ' ';  
  178.     }  
  179.     cout << endl;  
  180.   
  181.   
  182.   
  183.     Sqlist sQ = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//哨兵位    
  184.     cout << "原数组为:"<<endl;  
  185.     for (int i = 1; i <= 8; ++i)            //打印sQ  
  186.     {  
  187.         cout << sQ[i] << " ";  
  188.     }  
  189.     cout << endl;  
  190.   
  191.     int dlta[] = { 5, 3, 1 };             //增量数组    
  192.   
  193.     ShellSort(sQ, 8, dlta, sizeof(dlta) / sizeof(int));//希尔排序  
  194.   
  195.     cout << "希尔排序:" << endl;  
  196.     for (int j = 1; j <= 8; ++j)  
  197.     {  
  198.         cout << sQ[j] << " ";  
  199.     }  
  200.     cout << endl;  
  201. }  

输出结果:


0 0
原创粉丝点击