算法——排序之路(二)——希尔排序法(Shell Sort)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AnselLyy/article/details/52958062

希尔排序法(Shell Sort)

希尔排序法(缩小增量法)属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

但是这个算法存在不足:不稳定,d = "k" 的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取d = "k"。

学习代码:
#include <bits/stdc++.h>

using namespace std;

int a[1005];

void shell_sort(int *a, int n)
{
	int gap;
	for (gap = n/2; gap > 0; gap /= 2)
	{
		for (int i = 0; i < gap; i++)
		{
			for (int j = i+gap; j < n; j += gap)
			{
				if (a[j] < a[j-gap])
				{
					int temp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > temp)
					{
						a[k+gap] = a[k];
						k -= gap;
					}
					a[k+gap] = temp;
				}
			}
		}
	}
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i];
	shell_sort(a, n);
	for (int i = 0; i < n; i++) cout << a[i] << " ";
	cout << endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/AnselLyy/article/details/52958062