如果在對象序列中有兩個對象
算法執行時所需的附加存儲。
先取一個小於
根據算法的基本思想,shell插入排序的實現還是比較容易的,其C++實現如下:
#include
#include
using namespace std;
void print(int ar[], int sz, int step)
{
for(int i = 0; i < sz; ++i) {
if(((i + 1) % step) != 0)
cout << setw(3) << ar[i];
else
cout << setw(3) << ar[i] << endl;
}
cout << endl;
}
void ShellSort(int a[], int sz)
{
int i, j;
int step, temp;
step = sz / 2 ;
while(step) {
print(a, sz, step);
cout << ==> << endl;
for (i = step; i < sz; i++) {
temp = a[i];
j = i;
while (j >= step && a[j - step] > temp) {
a[j] = a[j - step];
j = j - step;
}
a[j] = temp;
}
print(a, sz, step);
cout << current array << endl;
print(a, sz, sz);
cout << ---------------- << endl;
step = step / 2.2;
}
}
int main(void)
{
int a[] = {13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10};
const size_t sz = sizeof(a)/sizeof(a[0]);
cout << Initial array << endl;
print(a,sz,sz);
cout << ------------- << endl;
ShellSort(a,sz);
cout << Sorted array << endl;
print(a,sz,sz);
return 0;
}
核心部分ShellSort中內層的while循環實現的是查找相應組內的插入位置,並提前進行位置的交換。而for循環控制的是從每個組內的第2個數開始重復在該組前面有序的數據表中實現直接插入排序。與直接插入排序的區別是shell插入排序一次for將所有組內的第i個數插入到各自前i-1個有序表中。
輸出為:
Initial array
13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10
-------------
13 14 94 33 82 25 59 94
65 23 45 27 73 25 39 10
==>
13 14 45 27 73 25 39 10
65 23 94 33 82 25 59 94
current array
13 14 45 27 73 25 39 10 65 23 94 33 82 25 59 94
----------------
13 14 45
27 73 25
39 10 65
23 94 33
82 25 59
94
==>
13 10 25
23 14 33
27 25 45
39 73 59
82 94 65
94
current array
13 10 25 23 14 33 27 25 45 39 73 59 82 94 65 94
----------------
13
10
25
23
14
33
27
25
45
39
73
59
82
94
65
94
==>
10
13
14
23
25
25
27
33
39
45
59
65
73
82
94
94
current array
10 13 14 23 25 25 27 33 39 45 59 65 73 82 94 94
----------------
Sorted array
10 13 14 23 25 25 27 33 39 45 59 65 73 82 94 94
這個方法對於大的數據集效率其實並不高,但是它是一個對小數量數據表(小於1000)進行排序的最快算法之一。另外,相對使用的內存較少。