shell排序(4^(j+1) + 3 * 2^j + 1)

本文介绍了一种使用Shell排序算法对整数数组进行排序的方法,并通过模板类实现了一种通用的打印数组元素的方式。该算法根据特定公式计算间隔序列,采用插入排序思想逐步缩小间隔直至完成整个数组的排序。
Code:
  1. #include <iostream>   
  2. #include <algorithm>   
  3. #include <cmath>   
  4. using namespace std;   
  5.   
  6. #define EQU(x)  ((4 * (x) + 3) * (x) + 1)   
  7.   
  8. template <typename Type>   
  9. struct Print   
  10. {   
  11.     void operator ()(Type& item)   
  12.     {   
  13.         cout << item << '/t';   
  14.     }   
  15. };   
  16.   
  17. void sort(int x[], int n)   
  18. {   
  19.     int gap;   
  20.     int power2;   
  21.     int temp;   
  22.     int i;   
  23.     int j;     
  24.     power2 = log((-3.0 + sqrt(16.0 * n - 7.0)) / 8.0) / log(2.0);   
  25.     power2 = 1 << (power2 + 1);   
  26.        
  27.     do  
  28.     {   
  29.         power2 >>= 1;   
  30.         gap = EQU(power2);   
  31.         for (i = gap; i < n; ++i)   
  32.         {   
  33.             temp = x[i];   
  34.             for (j = i - gap; j >= 0; j -= gap)   
  35.             {   
  36.                 if (x[j] > temp)   
  37.                 {   
  38.                     x[j + gap] = x[j];   
  39.                 }   
  40.                 else  
  41.                 {   
  42.                     break;   
  43.                 }   
  44.             }   
  45.                
  46.             x[j + gap] = temp;   
  47.                            
  48.         }   
  49.            
  50.     }while(gap > 1);   
  51.         
  52. }   
  53.   
  54.   
  55. int main(int argc, char *argv[])   
  56. {   
  57.     int x[10];   
  58.     for(int i = 0; i < 10; ++i)   
  59.     {   
  60.         x[i] = rand() % 100;   
  61.     }   
  62.        
  63.     for_each(x, x + 10, Print<int>());   
  64.     cout << endl;   
  65.        
  66.     sort(x, 10);   
  67.        
  68.     for_each(x, x + 10, Print<int>());   
  69.     cout << endl;      
  70.     return 0;   
  71. }  

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值