经典算法与数据结构的c++实现——shell排序算法

因为是经典的算法,所以网上描述一大把,直接上个图,直观些,给记性不好的菜鸟(如我)一点儿提示。


经典算法与数据结构的c++实现——shell排序算法_第1张图片

shell排序算法,是插入算法的一种改进,降低时间复杂度,不同选取gap的方式将改变算法的实现,我这里的采取的判断gap值,保持gap为奇数。
下面是代码(欢迎批评指点,之后应该会放到github上:https://github.com/y277an/princeton_algs4):

//---------------------------------Specification of Program------------------------------
// Program Name:shell排序
// Tools:VS_2013
// Language: C++
// Description: 可自由输入,不需要提早知道数据长度
// Date:2016.3.17
// Author:mseddl
//----------------------------------------------------------------------------------------

#include <iostream>
using namespace std;
void Swap(int& one, int & another)
{
	one ^= another;
	another ^= one;
	one ^= another;
}
void ShellSort(int *arr, int len)
{
	for (int delta = len / 2; delta>0; delta /= 2)//delta为shell的间隔
	{
		if (delta % 2 == 0)//为了提高效率,保证不重复排序,若delta为偶数,使其变成奇数
		{
			delta--;
		}
		for (int i = 0; i < delta; i++)//每个小分段的逐次循环
		{
			//以下实质为插入排序
			for (int j = i+delta; j < len; j += delta)//j为要排序的间隔数
			{
				for (int m = j-delta; m>=0; m -= delta)//m为有序的间隔数
				{
					int temp = arr[m];//有序间隔数的最后一个
					if (arr[m+delta]<arr[m])
					{
						Swap(arr[m + delta], arr[m]);
					}
				}

			}
		}
	}
	
}
int main()
{
	int len(0), temp;
	int *arr = new int[100];
	char ch;
	cout << "请输入要排序的数字,以空格隔开:";
	while (1)
	{
		cin >> temp;
		arr[len++] = temp;
		cin.get(ch);
		if (ch == '\n')
		{
			break;
		}
	}
	ShellSort(arr, len);
	cout << "排序后的数字为:";
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	delete[] arr;
}


你可能感兴趣的:(经典算法与数据结构的c++实现——shell排序算法)