排序算法——希尔排序

本文介绍了希尔排序的原理,它是插入排序的优化版本,通过分组和逐步缩小间隔进行排序。虽然具体如何提高效率有待深入理解,但希尔排序能有效减少比较和交换次数。文章提供了详细的代码实现,并附带注释。
摘要由CSDN通过智能技术生成

写个希尔排序算法的程序写了一个半小时,也是醉了,看样子对代码的 熟悉程度确实是还很差很差啊,废话不说了,总结如下:

希尔排序,感觉就是优化了的插入排序,先对待排序的数组进行分组,再排序。然后再组合起来,减小分组的间隙,再排序,再组合。其实我也不是很清楚,具体如何优于插入排序法,这个需要再认真发分析一下时间复杂度。在学完所有排序方法后进行总结。先把实现的思想和代码贴上来,代码有较详细的注释,图片来自百度百科


实现代码如下:

#include "stdafx.h"
#include<iostream>
#include<iomanip>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>


using namespace std;
void shell_sort(int a[], int arraylength, int n);
int main()
{
	int aa[] = { 70, 30, 40, 10, 80, 20, 90, 100, 75, 60, 45 };	
	int n;
	cout<< "请输入排序的初始增量";
	cin >> n;
	for (int i = n; i > 0; i--)//由用户设置初始量,依次递减,直到等于1
	{
		shell_sort(aa, sizeof(aa) / sizeof(int), i);
	}
	
	int size_aa = sizeof(aa) / sizeof(int);
	for (int i = 0; i < size_aa; i++)
	{
		cout << aa[i] << endl;
	}

	return 0;
}

void shell_sort(int a[], int arraylength, int n)//arraylength是数组的长度,传参数时,要顺便把这个也传过来,否则C++会只传数组的首地址,并不关系数据具体的大小
{
	int size_a = arraylength;
	for (int i = n; i < size_a; i = i + n)//外层循环,根据n控制跳跃程度
	{		
		for (int y = 0; y < n; y++)//内层循环,控制每个组元素的跳跃获取,并用插入排序法进行排序的
		{
			int j = i + y;//图中的例子是n=3的情况
			if (j < size_a)//特别注意判断一下,免得数组越界啊
			{
				int key = a[j];
				int m = j - n;
				while ((m >= 0) && (key <= a[m]))
				{
					a[m + n] = a[m];
					m = m - n;
				}
				a[m + n] = key;
			}			
		}		
		
	}
	
}
其实,初学者刚开始看这个代码,可能逻辑还是有点混乱的,我写的时候,并不是一气呵成的(所以也耽误时间了嘛),我先规定了初始量为3,按照3的标准写了如下代码,然后再用循环进行了修改,最后得到了上面的最终版本。

void shell_sort(int a[], int arraylength, int n)//该函数中n=3了
{
	int size_a = arraylength;
	for (int i = 3; i < size_a; i = i + 3)//外层循环,根据n控制跳跃程度
	{
		
		int j = i + 1;
		int key2 = a[j];
		int n = j - 3;
		while ((n >= 0) && (key2 <= a[n]))
		{
		a[n + 3] = a[n];
		n = n - 3;
		}
		a[n + 3] = key2;



		int key = a[i];
		int m = i - 3;
		while ((m >= 0) && (key <= a[m]))
		{
		a[m + 3] = a[m];
		m = m - 3;
		}
		a[m + 3] = key;



		int k = i + 2;
		if (k < size_a)
		{
		int key3 = a[k];
		int p = k - 3;
		while ((p >= 0) && (key3 <= a[p]))
		{
		a[p + 3] = a[p];
		p = p - 3;
		}
		a[p + 3] = key3;
		}		
	}
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值