标签:
特点:
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 }
标签:
原文地址:http://www.cnblogs.com/zhizhi25/p/5729601.html