【排序算法】-4.希尔排序

  • 前言:
    数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;
    数据序列2: 13-17-20-42-14 利用插入排序,13-14-17-20-42. Number of swap:3;
    如果数据序列基本有序,使用插入排序会更加高效。

  • 基本思想:
    在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
    然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。

  • #include<iostream>
    #include<vector>
    
    using namespace std;
    
    void print(vector<int> a) {
    	for (int i = 0; i < a.size(); i++) {
    		cout << a[i] << " ";
    	}
    	cout << endl;
    }
    
    
    int main() {
    
    	vector<int> arr{0,9,1,5,8,3,7,4,6,2};
    	cout << "原数组:" << endl;
    	print(arr);
    	//希尔排序
    	//在这之前排序算法基本是O(n2),希尔排序是突破这个算法的第一批算法之一
    	
    	int temp ;
    	int increment = arr.size();
    	while (increment>1) {
    	
    		increment = increment / 3 + 1;//分割为若干个子序列,increment是增量
    		cout << "increment  " << increment << endl;
    		for (int i = increment; i < arr.size(); i++) {
    			if (arr[i] < arr[i - increment]) {
    			    temp = arr[i];
    				int j;
    				for (j = i - increment; j > 0 && arr[j] > temp; j -= increment) {//此处for循环是插入排序的for循环
    					arr[j+increment] = arr[j];//记录后移
    				}
    				arr[j+increment] = temp;//插入排序一样
    				print(arr);
    			}
    		}
    	}
    
    	cout << "排序后:" << endl;
    	print(arr);
    
    	system("pause");
    
    }
    

  • 时间复杂度分析:希尔排序不是随便分组后的各自排序,而是相隔某个增量的记录组成一个子序列,实现跳跃式的移动,使得排序的效率增高。在这里:增量的选择是一个关键,目前还是一个难题,不过大量的研究表明,当增量序列为时,可以取得不错的效果。其时间复杂度为,要好于直接排序的O(n2),增量序列的最后一个增量必须是1才行。另外由于记录是跳跃式的移动,希尔排序不是一个稳定的排序算法。

  • 不管怎么说:shell排序使我们突破了慢速排序的时代(超越了n方的时间复杂度)。之后更为高效的排序算法也出现了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你解答关于希尔排序的问题。希尔排序是插入排序的一种改进算法,也被称为“缩小增量排序”。它的基本思想是将待排序的序列按照一定的间隔分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小间隔,直到间隔为1,最后对整个序列进行一次插入排序。 希尔排序的时间复杂度与间隔序列的选择有关,最坏时间复杂度为$O(n^2)$,平均时间复杂度为$O(n \log n)$。相比于插入排序,希尔排序的时间复杂度有了明显的提升,且其在实际应用中也表现得比插入排序好。 下面是希尔排序的示例代码: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 在这段代码中,我们首先定义了一个希尔排序的函数shell_sort,它接收一个列表arr作为参数,并返回排好序的列表。在函数中,我们首先获取列表的长度n和初始的间隔gap,然后开始循环,直到间隔为1为止。在每次循环中,我们将列表按照间隔分成若干个子序列,对每个子序列进行插入排序,将子序列按照升序排列。最后,我们将间隔除以2,继续循环直到间隔为1。 使用希尔排序对列表进行排序非常简单,只需要调用shell_sort函数即可。例如,我们可以这样调用函数: ```python arr = [5, 2, 8, 3, 1, 6] sorted_arr = shell_sort(arr) print(sorted_arr) ``` 这段代码会输出排好序的列表[1, 2, 3, 5, 6, 8]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值