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

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. wordpress Bloginfo()函数

    bloinfo($show); ‘name‘ – 显示在 设置 > 常规 中设置的“站点标题”. 该数据是从 wp_options 这个数据表中检索到的 "blogname" ...

  2. C++深度解析教程学习笔记(3)函数的扩展

    1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...

  3. 初次用SqlServer查看本地的Excel文件时需要注意的地方

    日常用到通过SqlServer 读取Excel文件的案例 ,记录下来 文件路径 :C:\Users\Administrator\Desktop\icd10.xls 1.查询语句: SELECT  *F ...

  4. 616. Add Bold Tag in String加粗字符串

    [抄题]: Given a string s and a list of strings dict, you need to add a closed pair of bold tag <b&g ...

  5. 1-new对象与直接构建对象

    #include <iostream> using namespace std; class A { public: A(){} A (int a){ this->a = a; } ...

  6. Python3.7安装Django

    一.系统环境 操作系统:Win7 64位 Python版本:3.7 二.安装参考 Django的下载网址:https://www.djangoproject.com/download/ 当前最新版本: ...

  7. Luogu 2597 [ZJOI2012]灾难

    BZOJ 2815. 解法还是挺巧妙的. 放上写得很详细很好懂的题解链接  戳这里. 一个物种$x$如果要灭绝,那么沿着它的入边反向走走走,一定可以走到一个点$y$,如果这个点$y$的物种灭绝了,那么 ...

  8. pip指定安装包版本

    pip是目前最好用的python包关系工具,没有之一. 1.版本范围符号:==.>=.<=.>.<. 2.单个安装示例: 1 2 3 pip install cchardet  ...

  9. pymysql模块使用---Python连接MySQL数据库

    pymysql模块使用---Python连接MySQL数据库 浏览目录 pymysql介绍 连接数据库 execute( ) 之 sql 注入 增删改查操作 进阶用法 一.pymysql介绍 1.介绍 ...

  10. jQuery中关于toggle的使用

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>t ...