希尔排序

特点:

1)不稳定的算法;

2)只能适用于顺序结构;

3)增量的取法多,并且时间依赖于增量的取法;

 

4)时间复杂度:O(nlog2n)  ;

 

5)空间复杂度:O(1).

 

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <vector>
 4 #include <string>
 5 #include <time.h>
 6 
 7 using namespace std;
 8 
 9 void showall(vector<int> &number)
10 {
11     for(int i = 0; i < number.size();i++)
12     {
13         cout << "number[" << i << "] = " << number[i] << endl;
14     }
15 }
16 //插入排序之希尔排序
17 void shellinsert(vector<int> &number)
18 {
19     int length = number.size();
20     for(int gap = length/2; gap > 0; gap /= 2)//gap是每组的步长
21     {
22         for(int i = 0; i < gap; i++) //i代表组数
23         {
24             for(int j = i; j < number.size(); j += gap)//此处开始插入排序
25             {
26                 for(int k = i; k < j; k += gap)//插入法此处是从前往后开始比较
27                 {    
28                     if(number[j] < number[k])    
29                     {            
30                         int temp = number[j];
31                         for(int x = j; x > k; x -= gap)
32                         {
33                             number[x] =number[x- gap];
34                         }
35                         number[k] = temp;
36                     }
37         
38                 }
39             }
40         }
41     }
42 }
43 
44 //直接插入法
45 void insert(vector<int> &number)
46 {
47     for(int i = 1; i < number.size();i++)
48     {
49         for(int j = i - 1; j  >= 0; j--)
50         {
51             if(number[i] < number[j])
52             {
53                 int temp = number[i];
54                 for(int x = i; x > j; x--)
55                 {
56                     number[x] = number[x - 1];
57                 }
58                 number[j] = temp;
59             }
60         }
61     }
62 }
63 
64 int main()
65 {
66     vector <int> number;
67     srand((int)time(0)); //s随机数种子
68     for(int i=0;i<10000;i++)
69     {
70         int num = rand() & 1000000;
71         number.push_back(num);
72     }
73     cout << endl;
74     showall(number);
75     shellinsert(number);
76     cout << endl;
77     showall(number);
78     system("pause");
79     return 0;
80 }

 

posted on 2016-08-02 15:50  枝枝  阅读(180)  评论(0编辑  收藏  举报