c/c++ 梳排序

c/c++ 梳排序

梳排序估计很多人都没听说过,更别说使用了。其实梳排序是在冒泡排序的基础上进行了优化,时间复杂度为O(n)~O(nn),它是不稳定的,而冒泡排序的时间复杂度为O(nn),所以梳排序比冒泡排序效率更高。

梳排序思路

(下面说到的1.3是怎么来的呢?由于梳排序是不稳定的,经过大量的验证之后,其实取1.2几是最适合的,但是一般都取1.3了,当然你取1.2,1.4,1.5也行,只不过取1.3是更加合适的,所以大家都取1.3)

比如要将8个数进行排序,假设这8个数为2,5,6,8,1,7,3,4,那么刚开始,j=8/1.3=6,每6个数分为一组,即2,5,6,8,1,7 3,4 ,第一组的第一个数和第二组的第一个数进行比较,如果满足交换条件(从小到大排序的话,如果前面一个数比后面一个数大,即为满足交换条件),则进行交换,此时有一个标志位flag=true,说明它有交换了。接着第一组的第二个数和第二组的第二个数进行比较,当比较到最后一组的最后一个数时,说明一轮比较已经结束了,如果此时j>1||flagtrue的话,程序继续执行,此时,j=6/1.3=4,重复上面的步骤,再然后,j=4/1.3=3,…,j=3/1.3=2,…j=2/1.3<1,j<1时,取j=1,继续执行完,如果flagtrue的话,就继续执行,如果flag==false了,就说明排序完成了,程序执行完成。

代码

//梳排序 
#include<bits/stdc++.h>//这是c++的万能头文件,大部分的c++的头文件都被包含在里面了
using namespace std;
void sorts(int a[],int n)
{
	int j=n;
	float s=1.3;
	bool flag=false;
	while(j>1||flag==true)
	{
		int i=0;
		j=((j/s)>1?(j/s):1);
		flag=false;
		while(i+j<n)
		{
			if(a[i]>a[i+j])
			{
				int temp=a[i];
				a[i]=a[i+j];
				a[i+j]=temp;
				flag=true;
			}
			i=i+1;
		}
	}
}

int main()
{
	int arr[]={2,5,6,8,1,7,3,4};
	sorts(arr,sizeof(arr)/sizeof(arr[0]));
	for(int i=0;i<8;i++)
	{
		cout<<arr[i]<<endl;
	}
	return 0;
}

第一次写博客,记录一下,哈哈哈哈。

2019.12.01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值