| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1500 人关注过本帖, 1 人收藏
标题:数据结构练习2~希尔排序~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:5 回复次数:6 
数据结构练习2~希尔排序~
每日学点新东西~感觉希尔排序是对插入排序的一种改进~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define MAX 255
int R[MAX]={0};
void ShellPass(int d,int n)
{
    /*希尔排序中的一趟排序,d为当前增量*/

    int i=0;
    int j=0;

    for (i=d+1;i<=n;++i)
        if (R[i]<R[i-d])
        {
            R[0]=R[i];
            j=i-d;
            /*R[0]只是暂存单元,不是哨兵*/

            do
            {
                /*查找R[i]的插入位置*/
                R[j+d]=R[j];
                /*后移记录*/
                j=j-d;
            }while (j>0&&R[0]<R[j]);

            R[j+d]=R[0];
            /*插入R[i]到正确的位置上*/
        }
}
void Shell_Sort(int n)
{
    int increment=n;
    /*增量初值,不妨设n>0*/
    do
    {
        increment=increment/3+1;
        /*求下一增量*/
        ShellPass(increment,n);
        /*一趟增量为increment的Shell插入排序*/
    }while (increment>1);
}
int main()
{
    int i=0;
    int n=0;
    /*clrscr()*/
    system("cls");

    puts("Please input total element number of the sequence:");
    scanf("%d",&n);

    if (n<1||n>MAX)
    {
        printf("n must more than 0 and less than %d.\n",MAX);
        exit(0);
    }

    puts("Please input the elements one by one:");
    for (i=1;i<=n;++i)
        scanf("%d",&R[i]);

    puts("The sequence you input is:");

    for (i=1;i<=n;++i)
        printf("%4d",R[i]);

    Shell_Sort(n);
    puts("\nThe sequence after shell_sort is:");

    for (i=1;i<=n;++i)
        printf("%4d",R[i]);

    puts("\n");

    return 0;
}


[此贴子已经被作者于2017-2-16 14:03编辑过]

搜索更多相关主题的帖子: color 
2017-02-16 13:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个是九九另外找资料的~和一楼的比对一下~

程序代码:
#include<stdio.h>
#include<math.h> 
#define MAXNUM 10 
void shellSort(int array[],int n,int t);
void shellInsert(int array[],int n,int dk);
int main()
{    
    //t为排序趟数    
    int array[MAXNUM],i; 
    
    for(i=0;i<MAXNUM;i++)        
        scanf("%d",&array[i]);   
    
    shellSort(array,MAXNUM,(int)(log(MAXNUM+1)/log(2)));

    //排序趟数应为log2(n+1)的整数部分 
    
    for(i=0;i<MAXNUM;i++)        
        printf("%d ",array[i]);    
     printf("\n");

     return 0;

} //根据当前增量进行插入排序
void shellInsert(int array[],int n,int dk)
{    
    int i,j,temp;    
    for(i=dk;i<n;i++)
    {        
        //分别向每组的有序区域插入   
        temp=array[i];       
        for(j=i-dk;(j>=i%dk)&&array[j]>temp;j-=dk)//比较与记录后移同时进行
            array[j+dk]=array[j];   
        
         if(j!=i-dk)            
            array[j+dk]=temp;//插入    
    }
} //计算Hibbard增量
int dkHibbard(int t,int k)
{    
    return (int)(pow(2,t-k+1)-1);

} //希尔排序
void shellSort(int array[],int n,int t)
{      
    int i;    
    for(i=1;i<=t;i++)       
        shellInsert(array,n,dkHibbard(t,i));
}


PS:1楼提供的代码没有希尔步长的计算公式(用i/3+1来代替)~~感觉这个较为系统~

[此贴子已经被作者于2017-2-16 14:29编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-16 14:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
再自己敲一遍熟悉一下~
PS:感觉参考代码没有什么可以挑剔的地方就没有改了~
程序代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
void creat(int** a,int* n)
{
    printf("请输入案例:");
    scanf("%d",n);
    if (*n<1||(*a=(int* )malloc(*n*sizeof(int)))==NULL)
        exit(0);

    memset(*a,0,*n*sizeof(int));
}
void input(int a[],int n)
{
    int i=0;

    printf("请输入%d个数据:\n",n);
    for (;i!=n;++i)
        scanf("%d",&a[i]);
}
void print(int a[],int n)
{
    int i=0;

    printf("输出结果如下:\n");
    for (;i!=n;++i)
        printf("%-4d",a[i]);

    printf("\n");
}
void shell_Insert(int a[],int n,int step)
{
    int i=0;
    int j=0;

    for (i=step;i<n;++i)
    {
        int key=a[i];
        for (j=i-step;(j>=i%step)&&a[j]>key;j-=step)
            a[j+step]=a[j];

        if (j!=i-step)
            a[j+step]=key;
    }
}
int dkHibbard(int t,int k)
{
    return (int )(pow(2,t-k+1)-1);
}
void shell_Sort(int a[],int n,int t)
{
    int i=0;

    for (i=1;i<t+1;++i)
        shell_Insert(a,n,dkHibbard(t,i));
}
int main()
{
    int *a=NULL;
    int n=0;

    creat(&a,&n);

    input(a,n);

    shell_Sort(a,n,(int )(log(n+1)/log(2)));

    print(a,n);

    free(a);

    return 0;
}


[此贴子已经被作者于2017-2-17 10:14编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-17 10:12
白衣柳相
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:142
专家分:168
注 册:2016-12-23
收藏
得分:3 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,我也考虑去看看希尔,不知道为什么想到哈希,虽然这两个我都不知道

什么最重要,学习!!!! 我要你们无话可说!我想要的东西自己去拿
2017-02-18 13:51
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:3 
看了下希尔排序的思路,还是不太明白为什么要这样做,说是让间距从<n开始,逐渐递减到1,那和直接取1又有什么区别就不懂了
2017-02-18 14:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 yangfrancis
今天九九外出~没怎么看贴~
希尔排序是基于插入排序~是对插入排序的一种改进~通过步长的设定来减少移动平均次数~原理是数据从一开始的无序时~希尔步长大~移动的数据的间隔较远~可以减少移动次数~后来希尔步长慢慢减少~但通过前面的移动数据~使数据趋向于有序了~固减少了移动次数~

[此贴子已经被作者于2017-2-18 23:10编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-18 23:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 白衣柳相
这个现在对橙子还深了点以后有机会再慢慢理解~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-18 23:07
快速回复:数据结构练习2~希尔排序~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018699 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved