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

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. PHP 使用memcached简单示例分享

    1.添加扩展包 代码如下: php_memcache.dll 2.在PHP.INI添加  代码如下: extension=php_memcache.dll 3.程序 代码如下: < ?php / ...

  2. json和pickle序列化模块

    一.json序列化模块 1.序列化:将内存数据转成字符串加以保存. 2.反序列化:将字符串转成内存数据加以读取. data = { '北京':{ '五道口':{ 'sohu':'引擎', } } } ...

  3. php学习第一天-勤劳致富

    所谓“勤劳致富”,是很有科学依据的,且是经过我的亲身实践的. 自毕设突然转变为开发项目之后,整个天都变了.先是妹子给我订的票被强行取消,然后又是师兄的一句“***一小时就搞定了”,说明一下这个***是 ...

  4. c++多线程编程(一)

    C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数 HANDLE CreateThread( ...

  5. 【HDU4301】Divide Chocolate

    题意 有一块n*2的巧克力,将它分成k块,问有多少种方法. 分析 emmm是dp没错了. 最容易想到的状态定义是f[i][j],意思是前i行,分成j块的方案数.但是发现没法转移.(后面会说一下为什么· ...

  6. CURL以 POST 请求链接的方式 初始化一个cURL会话来获取一个网页

    /** *POST URL */ function posturl($URL,$data) { $ch = curl_init(); // 创建一个新cURL资源 curl_setopt($ch,CU ...

  7. Part10-C语言环境初始化-C与汇编混合编程lesson4

    1.为什么要混合编程 汇编语言:执行效率高:编写繁琐: 执行效率高:能够更直接地控制处理器. c语言:可读性强,移植性好,调试方便. 1.汇编调用c函数 2.c调用汇编函数 汇编语言定义的函数(标号) ...

  8. hdu 2206 IP的计算(最全的注意事项)

    注意: 1.非法字符(包括空格) 如下都是错的 A.145.124.4 192.168.18 123(用scanf输入的话,则接收的是:192.168.18) 2.'.'有且仅有3个,且不能连续出现, ...

  9. jQuery对象与DOM对象及互相转化

    <p id=‘’hello”></p> 普通处理,通过标准JavaScript处理: var p = document.getElementById('hello'); p.i ...

  10. LightOJ 1027 A Dangerous Maze (数学期望)

    题意:你面前有 n 个门,每次你可以选择任意一个进去,如果xi是正数,你将在xi后出去,如果xi是负数,那么xi后你将回来并且丢失所有记忆,问你出去的期望. 析:两种情况,第一种是直接出去,期望就是 ...