谢尔排序(shellSort):

        通过比较一定间隔的元素进行工作,各趟比较随着算法的进行而减小,直到只比较相邻元素的最后一趟元素排序结束,因此谢尔排序有时也称缩减增量排序(diminishing increment sort).

行为描述:

算法描述:

        谢尔排序使用一个序列h_1, h_2, \ ... \ h_k,叫做增量序列(increment sequence)。 只要h_1=1,任何增量序列都是可行,不过有些增量序列比另一些增量序列好(如shell增量,Hibbard增量,sedgewick增量)。在使用增量h_k的一趟排序之后,对于每一个i有:a[i] \leq a[i+h_k],此时称文件为h_k的排序。

谢尔排序的性质:

        一个h_k排序的文件保持它的h_k排序性;

        定理:使用谢尔增量排序的最坏情形运行时间为O(N^2)。【当N = 2^k时,将第i个元素恢复到正确位置需要移动i-1次 \sum _{i = 1}^{N/2}(i-1) = O(N^2)

        定理:使用Hibbard增量排序的最坏情形运行时间为O(N^{3/2})。【增量序列:1 , 3, 5, 7, ... , 2^k -1。当对h_k排序时,h_{k+1},h_{k+2}已经为有序序列,而且h_{k+2} = \alpha h_{k+1} + \beta h_k \ \ \ \alpha , \beta \in N^*

总的运行时间:O(\sum_{i = 1}^{i = N/2} Nh_k + \sum_{i = N/2}^N N^2/h_k) = O(Nh_{N/2})+O(N^2/h_{N/2}) = O(N^{3/2})

        定理:使用sedgewick增量排序的最坏情形运行时间为O(N^{4/3})【增量序列:1, 5,19,41, ...,9 \times 4^i - 9 \times 2^i +1 或4^i - 3\times 2^i +1】。

谢尔增量排序实例:

//shellSort.cpp
#include<iostream>
#include<vector>

using namespace std;

template<class Compareable>
void shellSort(vector<Compareable> &v){
	//update gap
	for(int gap = v.size() / 2; gap > 0; gap /= 2){
		//traverse vector
		for(int i = gap; i < v.size(); i++){
			Compareable temp = v[i];
			int j = i;
			//find the proper location
			for(; j >= gap && temp < v[j - gap]; j -= gap){
				v[j] = v[j - gap];
			}
			//insert into the proper location;
			v[j] = temp;
		}
	}
}

int main(){
	int arr[] = {81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15};
	int len = sizeof(arr) / sizeof(arr[0]);
	vector<int> v;
	for(int i = 0 ; i < len; i++){
		v.push_back(arr[i]);
	}
	
	cout << "******* the original data ***********" << endl;
	for(typename vector<int>::iterator itr = v.begin(); itr != v.end(); ++itr){
		cout << *itr << " ";
	}
	cout << endl;
	
	cout << "******* the sorted data ***********" << endl;
	shellSort(v);
	for(typename vector<int>::iterator itr = v.begin(); itr != v.end(); ++itr){
		cout << *itr << " ";
	}
	cout << endl;
	
	cout << " done ." << endl;
	return 0;
}

practice makes perfect !

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐