【数据结构----笔记5】插入排序算法之【希尔排序算法】

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

/*______________________________________________________________________________________________________________
文件说明:
		【1】根据数据元素是否完全在内存中,可以将排序算法分为两类:【内部排序】,【外部排序】
		【2】【内部排序】是指在排序期间元素全部存放在内存中的元素;
		【3】【外部排序】是指在排序期间,元素无法全部同时存放在内存中,必须在排序过程中,根据要求不断在内、外存
			             之间移动的排序。
		【4】【排序】就是重新排列表中的元素,使表中的元素满足按关键字递增或递减的过程。
		【5】【排序算法的稳定性】
					如果待排序表中有两个元素Ri,Rj,其对应的关键字Keyi=Keyj,且在排序前Ri在Rj前面,如果使用某一
					排序算法排序后,Ri仍在Rj的前面,则称这个排序算法是稳定的,否则称该排序算法不稳定的
		【6】注意!!!
					(1)算法是否具有稳定性并不能衡量一个算法的优劣,它主要是对算法性质进行描述。
					(2)对于不稳定的排序算法,只需举出一组关键字的示例说明它的不稳定性即可。
		【7】一般情况下:
					内部排序算法在执行过程中都要进行两种操作:【比较】和【移动】通过比较两个关键字,确定对应的
					元素的前后关系,然后通过移动元素以达到有序。
		【8】并不是所有的内部排序算法都要基于比较操作,事实上,基数排序就不是基于比较的。
内部排序:
		【1】插入排序算法
				(1)直接插入排序
				(2)折半插入排序
				(3)希尔排序(shell sort)
		【2】交换排序
				(1)冒泡排序(bubble sort)
				(2)快速排序
		【3】选择排序
				(1)简单选择排序
				(2)堆排序
		【4】二路归并排序(merge sort)
		【5】基数排序
外部排序		
______________________________________________________________________________________________________________*/
#include<iostream>
using namespace std;

/*____________________________________________________________________________________________________________
【模块一】
		希尔排序算法
【函数模板】template<typename ElemType>void ShellSort(ElemType array[],int iLength)
		【适用性】希尔排序算法仅适用于当线性表为【顺序存储】的情况
【函数说明】
		【1】对数组array做【折半插入排序】
		【2】iLength为数组的长度
【希尔排序】
		【1】从前面的两个插入排序不难看出,直接插入排序算法适用于-----基本有序的排序表----和----数据量不大的表
		【2】基于此,D.L.Shell于1959年提出了希尔排序,又称为“缩小增量排序”
【希尔排序的基本思想】
		【1】先将【待排序表】分割成若干形如[i,i+d,i+2d,......,i+kd]的特殊子表
		【2】分别直接进行【插入排序】
		【3】当这个表中元素呈现“基本有序”时,再对全体记录进行一次【直接插入排序】
【算法性能】
		【1】【实用性】:希尔排序算法仅适用于当线性表为【顺序存储的情况】
		【2】希尔排序算法的时间复杂度一般认为O(nlogn),在最坏的情况下为O(n*n)
___________________________________________________________________________________________________________*/

template<typename ElemType>void ShellSort(ElemType array[],int iLength)
{
	for(int d = iLength/2;d>=1;d=d/2)
	{
		for(int k=0;k<d;k++)
		{

			for(int i=k+d;i<iLength;i+=d)
			{
				int temp = array[i];
				int j=i-d;
				while(j>=k&&temp<array[j])
				{
					array[j+d]=array[j];
					j=j-d;
				}
				array[j+d]=temp;
			}

		}
	}
}

/*____________________________________________________________________________________________________________
【主函数】
		 控制台应用程序  我们的程序从这里开始执行
___________________________________________________________________________________________________________*/
int main()
{
	int array[10]={3,2,1,7,4,6,9,8,5,0};
	cout<<"显示需要排序的序列"<<endl;
	for(int i=0;i<10;i++)
		cout<<array[i]<<"  ";
	cout<<"排序的结果是:"<<endl;
	ShellSort<int>(array,10);
	for(int i=0;i<10;i++)
		cout<<array[i]<<"  ";
	system("pause");
	return 0;
}







猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/77930292