Shell排序算法严格来说基于插入排序的思想,又称为希尔排序或缩小增量排序。Shell排序算 法的排序流程如下:
(1) 将有 n个元素的数组分成n/2 个数字序列,第 1 个数据和第n/2+1 个数据为一对,……。
(2) 一次循环使每一个序列对排好顺序。
(3) 然后,再变为n/ 4 个序列,再次排序。
(4) 不断重复上述过程,随着序列减少最后变为1 个,也 就完成了整个排序。
为了更清晰地理解Shell排序算法的执行过程,这里举一 个实际数据的例子逐步执行Shell排序算法。对 于 6 个整型数 据 127、118、105、101、112、100,这是一组无序的数据。对 其执行shell排序过程,如下所示。shell排序算法的执行 :
初始数据:127 118 105 101 112 100
一次排序: 101 112 100 127 118 105
二次排序:100 101 105 112 118 127
步骤如下:
(1) 第 1 次排序,首先将数组分为6/2=3个数字序列,第 1 个数据127和第4 个数据101为一 对,第 2 个数据118和第 5 个数据 112为一对,第 3 个数据 105和第6 个数据 100为一对。每一对 数据进行排序,此时排序后的数据为101、112、100、127、118、105。 (2) 第 2 次排序,将数组分为6/4=1个 序 列 (这里执行的取整操作),此时逐个对数据进行比 较,按照插入排序算法对这个序列进行排序。排序后的数据为100、101、105、112、118、127。 从上面的例子,读者可以非常直观地了解到shell排序算法的执行过程。其实前面我们已知道,在插入排序时,如果原数据已经是基本有序的,则排序的效率就可大大提高。另外,对于数量较小 的序列使用直接插入排序,因为需要移动的数据量较少,所以效率较高。因此,shell排序算法具有 比较高的执行效率。
下面是C++代码实现:
#include<iostream>
using namespace std;
void sort(int array[], int len) {
for (int r = len / 2; r >= 1; r /= 2) {
int temp, j;
for (int i = r; i < len; i++) {
temp = array[i];
j = i - r;
while (j>=0 && array[j]>temp)
{
array[j + r] = array[j];
j -= r;
}
array[j + r] = temp;
}
}
}
int main() {
int array[30];
for (int i = 0; i < 30; i++) {
array[i] = rand();
}
cout << "下面是排序前的数组:" << endl;
for (int i = 0; i < 30; i++) {
cout << array[i] << " ";
}
cout << endl;
sort(array,30);
cout << "下面是排序后的数组:" << endl;
for (int i = 0; i < 30; i++) {
cout << array[i] << " ";
}
cout << endl;
system("pause");
}
执行结果如下: