数据结构实验之排序六:希尔排序

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)

Input

连续输入多组数据,每组输入数据的第一行给出一个正整数N(N <= 10000),随后连续给出N个整数表示待排序关键字,数字间以空格分隔。

 

Output

输出dk=n/2和dk=1时的结果。

Sample Input

10
10 9 8 7 6 5 4 3 2 1
10
-5 9 7 -11 37 -22 99 288 33 66

Sample Output

5 4 3 2 1 10 9 8 7 6
1 2 3 4 5 6 7 8 9 10
-22 9 7 -11 37 -5 99 288 33 66
-22 -11 -5 7 9 33 37 66 99 288

Hint

 

Source

xam

SDUTACM运维技术中心.

第一次看到“希尔排序”这个名字的时候, 呀,好高大上的名字,难度一定不小。。后来再看看这个题,不是很难嘛,自己把自己吓到了。
就是一个希尔增量的事儿嘛,增量从n/2开始,到1结束。增量是从n/2开始排,排完一趟之后状态是:从第一项开始,这一项与与这一项相差n/2个数的那一项,这两个数是排好序的;然后增量减半,排完一趟后每一对相差n/4的数是排好序的;

到最后增量=1,每个数与它挨着的一个数就是排好序的,也就排完了。比如8个数,排完一趟后是第一个数a[0]与第五个数a[4]是排好序的,a[1]与a[5],a[2]与a[6],a[3]与a[7]都是两两排好序的;排完两趟后是a[0]与a[2],a[1]与a[3],a[2]与a[4],a[3]与a[5],a[4]与a[6],a[5]与a[7],a[6]与a[8]是两两排好序的;三趟后就是a[0]&a[1],a[1]&a[2],a[2]&a[3]、、、也就是这就排完了。

 

上代码:

#include <stdio.h>
#include <stdlib.h>
#define N 10100 void shellsort(int a[],int n){
int i,j;
int dk = n/2;
while(dk>=1){
for(i=dk;i<n;i++){
int temp = a[i];
j = i - dk;
while(j>=0 && a[j]>temp){
a[j+dk] = a[j];
j = j - dk;
}
a[j+dk] = temp;
}
dk = dk/2;
}
} int main(){
int A[N];
int n,i;
while(~scanf("%d",&n)){
for(i=0; i<n; i++)
scanf("%d",&A[i]);
shellsort(A,n);
for( i=0;i<n-1;i++){
printf("%d ",A[i]);
} printf("%d\n",A[i]);
}
return 0;
}

基本上的过程就是这样,然后题目呢要求输出dk=n/2和dk=1时的结果,稍作修改就可以了:

#include <stdio.h>
#include <stdlib.h>
#define N 10100 int dk; void shellsort(int A[],int length){
int i,j;
while(dk>=1){
for(i=dk;i<length;i++){
int temp = A[i];
j = i - dk;
while(j>=0 && A[j]>temp){
A[j+dk] = A[j];
j = j - dk;
}
A[j+dk] = temp;
}
dk = dk/2;
}
} int main(){
int A[N];
int n,i,j;
while(~scanf("%d",&n)){
for(i=0; i<n; i++){
scanf("%d",&A[i]);
} dk = n/2; for(i=dk;i<n;i++){
int temp = A[i];
j = i - dk;
while(j>=0 && A[j]>temp){
A[j+dk] = A[j];
j = j - dk;
}
A[j+dk] = temp;
}
dk = dk/2; for( i=0;i<n-1;i++){
printf("%d ",A[i]);
} printf("%d\n",A[i]);
//先输出第一波; shellsort(A,n);
for( i=0;i<n-1;i++){
printf("%d ",A[i]);
} printf("%d\n",A[i]);
}
return 0;
}

OK.

SDUT OJ 3403 数据结构实验之排序六:希尔排序的更多相关文章

  1. SDUT OJ 1479 数据结构实验之栈:行编辑器

    数据结构实验之栈:行编辑器 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  一个简单的行编辑程序的功能是:接受用户从终端输入的程 ...

  2. SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)

    数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  3. SDUT OJ 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  4. SDUT OJ 数据结构实验之链表六:有序链表的建立

    数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Desc ...

  5. SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...

  6. SDUT 3362 数据结构实验之图论六:村村通公路

    数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 当前农村公 ...

  7. SDUT-3378_数据结构实验之查找六:顺序查找

    数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...

  8. SDUT-2121_数据结构实验之链表六:有序链表的建立

    数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个无序的整数,建立一个有序链 ...

  9. 数据结构和算法(Golang实现)(22)排序算法-希尔排序

    希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...

随机推荐

  1. delphi IOS发布添加其他资源文件

    添加自己的文件. Project>Deployment>Add File Remote Path android and IOS: assets\internal\ TPath.GetDo ...

  2. 监控和安全运维 1.7 nagios配置邮件告警

    8. 配置邮件告警 服务端 vim /etc/nagios/objects/contacts.cfg 增加: define contact{ contact_name use generic-cont ...

  3. 清除苹果手机input的默认样式

    在手机端上写了一个页面,按钮的地方是用input标签button按钮,给的是绿色的背景颜色,在安卓手机上显示正常,在苹果手机上显示不正常,如下图 解决办法: css加上下面这一行代码就可以了,inpu ...

  4. Redhat 下添加用户到docker用户组

    1. 检查系统中是否存在docker用户组,如果没有则手动添加 # sudo cat /etc/group |grep docker # sudo grouped -g 999 docker # -g ...

  5. Android中资源文件夹res/raw和assets的使用

    Android中资源文件夹res/raw和assets的使用 2011-12-08 11:05 494人阅读 评论(0) 收藏 举报 androidxml存储stringencodinglayout ...

  6. SQLSERVER索引在什么情况下会失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...

  7. UVA-11280 Flying to Fredericton

    题意 给定一些国家,和两个国家间的花费,现在有一些询问,询问每次最多转k次飞机,最小花费 分析 最短路的裸题,跑spfa或者dijsktra什么的都行 多开一维来记录转k次飞机时的最短路是什么(拆点? ...

  8. 使用python创建生成动态链接库dll

    如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言.绝大部分的深度学习工具包都有python的版本,很多重要算法都有python版本的实现.为了将这些算法应用到具体工程中,这些工具 ...

  9. Docker学习笔记_安装ActiveMQ

    一.实验环境 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04,虚拟机名称:Ubuntu18VM1,虚拟机IP:192.168.8.25 3.操作账号 :Docker 4.在 ...

  10. js弹出窗口

    function openModalDialog(url, height, width) { var t_height = 400; var t_width = 600; if (!isNaN(hei ...