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