排序法系列之二----插入排序(直接插入,希尔排序,二分插入,链表插入排序)的C++代码实现

  

插入排序法包括:直接插入法(稳定),希尔排序法(不稳定),二分插入排序(稳定),链表插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。

        1. 从第一个元素开始,该元素可以认为已经被排序

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

  5. 将新元素插入到下一位置中

  6. 重复步骤2

直接插入排序法的C++代码如下:元素由低到高排序

#include<iostream>
using namespace std;
void InsertSort(int *a,int length)
{
	int i,j;
	for(i=1;i<length;i++)
	{
		int key=a[i];
		for(j=i-1;j>=0;j--)
		{
			if(key>a[j])
				break;
			else
			{
				a[j+1]=a[j];
				a[j]=key;
			}
		}
	}
}
int main()
{
	int b[10]={4,6,2,3,5,1,7,9,8,10};
	InsertSort(b,10);
	for(int i=0;i<10;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	return 0;
}


 以下代码为直接插入排序法利用STL容器和模板实现的:

#include<iostream>
#include<vector>
using namespace std;
template<typename Type>
void InsertionSort(vector<Type>&a)
{
	int n=a.size();
	vector<Type>::iterator it,is;
	for(it=a.begin()+1;it!=a.end();it++)
	{
		is=it;
		Type num=*is;
		while(is!=a.begin()&&num<*(is-1))
		{
			*is=*(is-1);
			is--;
		}
		*is=num;
	}
}
void InsertSort(int *a,int length)
{
	int i,j;
	for(i=1;i<length;i++)
	{
		int key=a[i];
		for(j=i-1;j>=0;j--)
		{
			if(key>a[j])
				break;
			else
			{
				a[j+1]=a[j];
				a[j]=key;
			}
		}
	}
}
int main()
{
	int b[10]={4,6,2,3,5,1,7,9,8,10};
	vector<int>a(b,b+10);
	InsertionSort(a);
	vector<int>::iterator it;
	for(it=a.begin();it!=a.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	InsertSort(b,10);
	for(int i=0;i<10;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	return 0;
}


 

希尔排序(Shell Sort)

插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

 

基本思想

  希尔排序基本思想:
  先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行 直接插入排序 ;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值