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

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. Java微信公众平台开发(六)--微信开发中的token获取

    转自:http://www.cuiyongzhi.com/post/44.html (一)token的介绍 引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access ...

  2. hadoop文件写入

    转:http://blog.csdn.net/xiaoshunzi111/article/details/48198105 由上图可知;写入文件分为三个角色,分别是clientnode  nameno ...

  3. idea maven项目依赖项有红色波浪线

    在maven面板选中所有报错的maven项目,右键选择移除(remove),之后重新添加.

  4. 09-nginx Rewrite语法详解

    和location类似,也是要负责URL解析的. rewrite  重写 nginx的配置非常多,nginx的第三方模块也非常非常多.不可能讲每一种模块的配置办法.通常碰到一个nginx的新问题你想怎 ...

  5. laravel的模型关联之(一对多的反向)

    一对多的反向 一对多的反向就相当于,一个用户有多篇文章,但是在显示文章模型的时候你又想显示这个用户的用户名,但是你只有用户id, 这时候就用到了一对多的反向,你用用户(User)模型里面定义了一对多来 ...

  6. 基于unittest测试框架的扩展

    1 unittest介绍 Unittest,Python自带的单元测试框架,PyUnit类包含TestResult,TestCase, TestSuite,TextTestResult,TextTes ...

  7. Marr的视觉计算理论

            Marr的视觉计算理论立足于计算机科学,系统地概括了心理物理学.神经生理学.临床神经病理学等方面已取得的所有重要成果,是迄今为止最为系统的视觉理论.Marr 的视觉计算理论虽然在细节甚 ...

  8. JavaPersistenceWithMyBatis3笔记-第5章Configuring MyBatis in a Spring applications-001

    一. 1.Mapper /** * */ package com.mybatis3.mappers; import java.util.List; import org.apache.ibatis.a ...

  9. Flask 之 上下文管理

    Flask上下文管理 分类: 请求上下文管理 应用上下文管理 请求上下文管理 request a. 温大爷:wsig b. 赵毅: ctx = ReuqestContext(session,reque ...

  10. 列表推导式对比For循环执行效率

    我们在前面的学习中都知道,如果把1-10以内的元素追加到一个新的列表表中,如果使用for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) prin ...