標籤:turn shel main 交換 時間 效能 pos 運行 iostream
在插入排序中,所有的元素都是挨個和前一個元素進行比較,共置換位置。所以交換的次數為N的平方層級。極端情況下,如果最小元素在最右側,那麼需要逐個和前面元素進行置換。如果將比較的間隔增大,那麼會減少移動次數,然後逐次降低比較間隔。
於是比較的間隔的序列如下 h = 3*h+1。
代碼如下:
1 #include <iostream> 2 3 using namespace std; 4 5 void change(int *p,int pos1,int pos2); 6 void shellSort(int *p,int length); 7 void print(int *p,int length); 8 9 int main()10 {11 int p[] = {2,5,3,11,89,76,24,33,15};12 shellSort(p,sizeof(p)/sizeof(int));13 print(p,sizeof(p)/sizeof(int));14 cout << "Hello world!" << endl;15 return 0;16 }17 18 void print(int *p,int length)19 {20 for(int i=0;i<length;i++)21 cout << p[i] << endl;22 }23 24 void shellSort(int *p,int length)25 {26 int h = 0;27 while(h<length/3)28 {29 h=3*h+1;30 }31 while(h>=1)32 {33 for(int i=1;i<length;i++)34 {35 for(int j=i;j>=h&&p[j]<p[j-1];j-=h)36 {37 change(p,j,j-h);38 }39 }40 h = h/3;41 }42 }43 44 void change(int *p,int pos1,int pos2)45 {46 if(pos1 == pos2)47 {48 return;49 }50 int temp=p[pos1];51 p[pos1] = p[pos2];52 p[pos2] = temp;53 }
目前要理解shell 排序的效能仍然是個挑戰,這個需要靠專家努力,但最重要的結論就是,已耗用時間不到N的平方層級。
排序-shell排序