希尔排序
1 #include <iostream> 2 #include <cstdlib> 3 4 #define ARR_SIZE 10 5 6 using namespace std; 7 8 void shellshort(int a[]); 9 void CreateRandArr(int a[]); 10 void exchange(int *a, int *b); 11 12 int main() 13 { 14 int a[ARR_SIZE]; 15 int i; 16 CreateRandArr(a); 17 shellshort(a); 18 cout << "after sort: " << endl; 19 for(i=0;i<ARR_SIZE;i++) 20 { 21 cout << a[i] << ' ' ; 22 } 23 24 return 0; 25 } 26 27 /* 记住,希尔排序只是比插入排序多了一层while循环和一个递增序列,最内部的for循环把插入排序的1替换成当前递增量h就行了 */ 28 void shellshort(int a[]) 29 { 30 int i, j, temp, h=1; 31 while(h < ARR_SIZE/3)h=h*3 +1; /* 构造递增序列 */ 32 while(h>=1) 33 { 34 for(i=h; i<ARR_SIZE; i++) /* 外围这个for循环每进行一次相当于对每个间隔为h的序列的第i个元素做排序 */ 35 { 36 for(j=i; j>=h && a[j]<a[j-h]; j-=h) /* 注意这里j的条件是j>=h.否则j-h可能取值小于0 */ 37 { 38 exchange(&a[j], &a[j-h]); 39 } 40 } 41 h = h/3; /* 按递增序列逐步缩小h,由递增序列可知最后h一定可以等于1,届时相当于插入排序 */ 42 } 43 44 } 45 46 void CreateRandArr(int a[]) 47 { 48 int i; 49 for(i=0;i<ARR_SIZE;i++) 50 { 51 a[i] = rand() % 100; 52 cout <<a[i] << ' ' ; 53 } 54 cout << endl; 55 } 56 57 void exchange(int *a, int *b) 58 { 59 int temp; 60 temp = *a; 61 *a = *b; 62 *b = temp; 63 }