解析shell排序的实现代码

所属分类: 软件编程 / C 语言 阅读数: 148
收藏 0 赞 0 分享
复制代码 代码如下:

#include <iostream>
using namespace std;
void ShellQin(int A[],int n)
{
    int gap=n/2;
    int i,j;
    for(;gap>0;gap=gap/2)//设置初始gap,按照gap进行分组,gap按照gap/2递减
    {
        //设置好gap以后,从gap开始一直到最后一个元素,为每一个元素在其对应的组进行插入排序。gap应该是该组所在位置的第2个元素,第一个元素位置是0
        for(i=gap;i<n;i++)
        {
            j=i;
            //对一组进行插入排序
            if(A[j-gap]>A[j])
            {
                /*如果A[j]>A[j-gap]意味着A[j]大于其所在组的前一个位置,那么将
                  A[j]保存在temp中,将从组中所有大于A[j]的数后移,最后空出来的位置
                  存放A[j]
                */
                int temp=A[j];//保存A[J]
                do
                {
                    A[j]=A[j-gap];
                    j=j-gap;
                }while(j>=0&&temp<A[j]);//后移每一个大于A[j]的数
                A[j+gap]=temp;//将A[j]插入到合适的位置
            }
        }
    }
    for(i=0;i<n;i++)
    {
        cout<<*(A+i)<<" ";
    }
}
int main1()
{
    int a[]= {5,4,3,21,1,100,93,1,3,2,4};
    ShellQin(a,11);
    return 0;
}

和朋友讨论过后,虽然希尔和插排最坏的情况都是n平方,认为希尔效率要比插排好的原因是,时间复杂度前面的系数要小于插排,特别是逆序的时候,很明显的减少了比较的次数。就如同快排之于堆排,快排前的系数远小于堆排,加上简单易用所以称为程序员们最爱。
下面的这种算法也叫做shell排序,与上面的区别在于进行插入排序的时候用交换相邻两个数据代替了移位(即先取出key关键字,将大于key的值向后移位)
复制代码 代码如下:

//交换两个小数
void swapdouble(double *a,double *b){
   double temp=*a;
   *a=*b;
   *b=temp;
}
void Shell(double* p,int n)
{
    int gap=n/2;
    int i,j;
    for(;gap>0;gap=gap/2)
    {
        for(i=gap;i<=n-1;i++)//从gap开始为所在的每个组进行插入排序,i=gap是该组的第二个元素
        {
            j=i;
            if(*(p+j)<*(p+j-gap))
            {
                while(j>=gap && *(p+j)<*(p+j-gap))
                {
                    swapdouble(p+j,p+j-gap);
                    j=j-gap;
                }
            }
        }
    }
}

更多精彩内容其他人还在看

深入解析C++中派生类的构造函数

这篇文章主要介绍了深入解析C++中派生类的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++中多层派生时的构造函数及一些特殊形式

这篇文章主要介绍了解析C++中多层派生时的构造函数及一些特殊形式,特殊形式主要针对基类和子对象类型的构造函数内容,需要的朋友可以参考下
收藏 0 赞 0 分享

简单介绍C++编程中派生类的析构函数

这篇文章主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
收藏 0 赞 0 分享

深入解析C++中类的多重继承

这篇文章主要介绍了深入解析C++中类的多重继承,包括多重继承相关的二义性问题,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++中基类与派生类的转换以及虚基类

这篇文章主要介绍了详解C++中基类与派生类的转换以及虚基类,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++编程中的继承方面的运用

这篇文章主要介绍了解析C++编程中的继承方面的运用,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++编程的多态性概念

这篇文章主要介绍了C++编程的多态性概念,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

c++统计文件中字符个数代码汇总

本文给大家汇总介绍了3种使用C++实现统计文件中的字符个数的方法,非常的简单实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

详解C++编程中的虚函数

这篇文章主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言putenv()函数和getenv()函数的使用详解

这篇文章主要介绍了C语言putenv()函数和getenv()函数的使用详解,用来进行环境变量的相关操作,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多