【数据结构----笔记4】插入排序算法之【折半插入排序算法】

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

/*______________________________________________________________________________________________________________
文件说明:
		【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 BinSort(ElemType array[],int iLength)	
【函数说明】
		【1】对记录数组array做【折半插入排序】
		【2】iLength为记录中待排序记录的数目
【算法思想】
		【1】从查找算法的讨论中可知,对于【有序的顺序表】进行折半查找,其性能优于顺序查找。所以,可以将
			【折半查找】的思想应用在有序的记录中确认插入的位置,相应的排序算法称为【折半插入排序算法】
		【2】采用【折半插入排序算法】,可以减少关键字比较的次数。每插入一个元素,需要比较的次数最大折半
		判定树的深度。

___________________________________________________________________________________________________________*/
template<typename ElemType>void BinSort(ElemType array[],int iLength)
{
	ElemType temp;

	for(int i=1;i<iLength;i++)
	{
		temp      =  array[i];

		int iLow  =  0;
		int iHigh =  i-1;
		int iMid  = 0;

		while(iLow  <=  iHigh)
		{
			iMid  = (iLow+iHigh)/2;
			if(temp <array[iMid])
			{
				iHigh  =  iMid - 1;
			}
			else
			{
				iLow   =  iMid + 1;
			}
		}

		for(int j=i-1;j>=iLow;j--)
		{
			array[j+1]  =  array[j];
		}
		array[iLow]=temp;
	}
}

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













猜你喜欢

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