排序算法第二天——希尔排序

 
 

希尔排序有以下的优缺点:

优点:算法较简单,代码短,需要的空间小,速度还可以,适合情况复杂的排序,适合中小规模的排序。 

缺点:速度偏慢,不够智能,不适合情况简单的排序,不适合大规模排序。

代码实现和理解:

#include <stdio.h>
#include <stdlib.h>
/****************************************************************************************
*希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效 *
*的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。            *
*希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少 *
*每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。            *
*****************************************************************************************/

/******************************************* 
*函数名称:Shsort 
*参数说明:pDataArray 无序数组指针
*          iDataNum   无序数据个数 
*说明:    希尔排序 
********************************************/  
void Shsort(int* pDataArray,int iDateNumn)
{
    int i,j,d;
    d = iDateNumn / 2;                                   /*确定固定增量值,设为数组长度的一半*/
    while(d >= 1)                                        /*增量等于1退出循环*/
    {
        for(i = d;i < iDateNumn;i++)                     /*数组下标从d开始进行直接插入排序*/
        {                                                /*也就是数组的第d+1个元素*/
            int temp = pDataArray[i];                    /*设置监视哨,元素最右边的位置*/
            j = i - d;                                   /*确定要进行比较的元素的最左边位置*/
            while((j >= 0) && (temp < pDataArray[j]))    /*从后向前,找到比其小的数的位置*/
            {
                pDataArray[j + d] = pDataArray[j];       /*数据右移*/
                j -= d;                                  /*向左移动d个位置*/
            }
            if (j != i - d)                              /*存在比其小的数*/
                pDataArray[j + d] = temp;                /*在确定的位置插入pDataArray[i]*/
        }
        d = d / 2;
    }

}

/******************************************* 
*函数名称:main
*参数说明:无
*说明:    主函数 
********************************************/  
void main(void)
{
    int pDataArray[10],i;                        
    printf("请输入10个数据:\n");
    for(i = 0;i < 10;i++)
        scanf("%d",&pDataArray[i]);
    Shsort(pDataArray,10);
    printf("排序后的顺序是:\n");
    for(i = 0;i < 10;i++)
        printf("%5d",pDataArray[i]);
    printf("\n");
    system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_42070071/article/details/80201420