shell排序 C++

       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
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");
}

执行结果如下:



你可能感兴趣的:(shell排序 C++)