SDUT OJ 3403 数据结构实验之排序六:希尔排序
数据结构实验之排序六:希尔排序
Time Limit: 1000 ms Memory Limit: 65536 KiBProblem 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
就是一个希尔增量的事儿嘛,增量从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 数据结构实验之排序六:希尔排序的更多相关文章
- SDUT OJ 1479 数据结构实验之栈:行编辑器
数据结构实验之栈:行编辑器 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程 ...
- SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)
数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
- SDUT OJ 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- SDUT OJ 数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Desc ...
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...
- SDUT 3362 数据结构实验之图论六:村村通公路
数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 当前农村公 ...
- SDUT-3378_数据结构实验之查找六:顺序查找
数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...
- SDUT-2121_数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个无序的整数,建立一个有序链 ...
- 数据结构和算法(Golang实现)(22)排序算法-希尔排序
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...
随机推荐
- django表单的字段验证(clean_<fieldname>())和ajax的字段验证
django中的Form有个很重要的功能:验证用户输入 而验证用户输入也可以分为2种: (1)前端本身的验证,例如:字段是否可为空,手机号码格式是否正确等: (2)前端输入数据和后台数据库数据的验证, ...
- 页面布局整理(基于scss)
页面开发步骤: 1.全局reset.设置基础背景色.设置基础字体样式 2.全局布局页面结构,meta 标签引入 3.按钮等相同的样式,用scss提前写好一份公用,渐变等 border-radius b ...
- 虚拟机之 Wordpress博客搭建
WordPress博客需要LAMP环境,--- LAMP 官网:https://cn.wordpress.org/ wordpress-4.4.1版本环境要求是: php 5.2.4或以上 mysq ...
- 将.sql文件导入powerdesigner的实现方法详解
将.sql文件导入powerdesigner的步骤是本文我们主要要介绍的内容,步骤如下: 第一步:将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 第二步:在powerd ...
- 【HDU 6031]】 Innumerable Ancestors
题意 有一棵有n个结点的树,这里有m个询问,每个询问给出两个非空的结点集合A和B,有些结点可能同时在这两个集合当中.你需要从A和B中分别选择一个节点x和y(可以是同一个结点)你的目标是使LCA(x,y ...
- 关于PHP的一个坑爹问题(页面刷新)
最近在用PHP做一个服务端和一个客户端,在快要完工的时候,出现了一个重大问题---- 当在客户端手动输入IP和端口的时候,一按连接,OK,连接成功,嘻嘻,就在我自以为大功告成的时候,来了个晴天霹雳,一 ...
- PHPMailer fe v4.11 For Thinkphp 3.2
PHPMailer fe v4.11 For Thinkphp 3.2,你值得拥有! 今晚用TP3.2开发一个东西的时候需要邮件发送功能,理所当然的想到了PHPMailer.于是有了此文!------ ...
- opennebula image单个实例响应数据格式
{ ", ", ", "TEMPLATE": { "DEV_PREFIX": "hd", " }, ...
- 如何安全退出已调用多个Activity的应用
对于单一Activity的应用来说,退出很简单,直接finish()即可.当然,也可以用killProcess()和System.exit()这样的方法. 但是,对于多Activity的应用来说,在打 ...
- groupie
def add_group(group): c = group.c.astype('float') group['d'] = c/c.sum() return group df = pd ...