SDUT-3403 数据结构实验之排序六:希尔排序
来源:互联网 发布:网上卖的淘宝教程没用 编辑:程序博客网 时间:2024/06/13 21:35
数据结构实验之排序六:希尔排序
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)
Input
连续输入多组数据,每组输入数据的第一行给出一个正整数N(N <= 10000),随后连续给出N个整数表示待排序关键字,数字间以空格分隔。
Output
输出dk=n/2和dk=1时的结果。
Example Input
1010 9 8 7 6 5 4 3 2 110-5 9 7 -11 37 -22 99 288 33 66
Example Output
5 4 3 2 1 10 9 8 7 61 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
Author
xam
可参考:http://blog.csdn.net/morewindows/article/details/6668714
#include <bits/stdc++.h>using namespace std;int a[11111],n,b[11111];int judge(int x,int y){ if(x<y) return 1; else return 0;}void shell(int dk){ int k; for(int i=1; i<=dk; i++) { for(int j=i+dk; j<=n; j+=dk) { if(a[j]<a[j-dk]) { a[0]=a[j]; for(k=j-dk; judge(a[0],a[k])&&k>=1; k=k-dk)///注意k=k-dk { a[k+dk]=a[k]; } a[k+dk]=a[0];///因为a[k]<a[0],所以a[0]要放到a[k]前边,即k+dk } } } for(int i=1; i<=n; i++) { if(i==1) cout<<a[i]; else cout<<' '<<a[i]; } cout<<endl;}void Shell(int a[]){ int k; for(int dk=n/2; dk>=1; dk/=2) { for(int i=1; i<=dk; i++) { for(int j=i+dk; j<=n; j+=dk) { if(a[j]<a[j-dk]) { a[0]=a[j]; for(k=j-dk; judge(a[0],a[k])&&k>=1; k-=dk) { a[k+dk]=a[k]; } a[k+dk]=a[0]; } } } } for(int i=1; i<=n; i++) { if(i==1) cout<<a[i]; else cout<<' '<<a[i]; } cout<<endl;}int main(){ while(cin>>n) { for(int i=1; i<=n; i++) { cin>>a[i]; b[i]=a[i]; } shell(n/2); Shell(b); } return 0;}
正确:a[0]=a[j];for(k=j-dk; judge(a[0],a[k])&&k>=1; k=k-dk) { a[k+dk]=a[k]; } a[k+dk]=a[0];错误: a[0]=a[j];a[j]=a[j-dk]; for(k=j-2*dk; judge(a[0],a[k+dk])&&k>=1; k-=dk) { a[k+dk]=a[k];///此条件下,当a[j-2*dk]<a[j-dk],会使a[j-dk]=a[j-2*dk],但是实际情况应该是a[j-dk]=a[0]直接终止循环 } a[k+dk]=a[0];
改进: for(int dk=n/2; dk>=1; dk/=2) { for(int j=dk+1; j<=n; j+=dk) { if(a[j]<a[j-dk]) { a[0]=a[j]; for(k=j-dk; judge(a[0],a[k])&&k>=1; k-=dk) { a[k+dk]=a[k]; } a[k+dk]=a[0]; } } } for(int dk=n/2; dk>=1; dk/=2) { for(int i=dk+1; i<=n; i++) for(int j=i-dk; j>=1&&a[j]>a[j+dk]; j=j-dk) swap(a[j],a[j+dk]); }
阅读全文
0 0
- SDUT 3403 数据结构实验之排序六:希尔排序
- SDUT OJ 3403数据结构实验之排序六:希尔排序
- SDUT-3403 数据结构实验之排序六:希尔排序
- (模板题)sdut 3403 数据结构实验之排序六:希尔排序(希尔排序)
- SDUT 数据结构实验之排序六:希尔排序
- sdut oj3403 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- 数据结构实验之排序六:希尔排序
- Apache虚拟主机开启PHP短标签
- Install Oracle Java 8 / 9 in Ubuntu 16.04, Linux Mint 18
- 【依葫芦画瓢】SSM-CRUD --- 1
- iOS 音视频之网络视频播放AVPlayerViewController(iOS8.0+使用)
- Latex写论文中,算法过长,需要分页显示的方法
- SDUT-3403 数据结构实验之排序六:希尔排序
- (Tensorflow+python)张量、会话、向前传播
- 1421 整数转字符串(递归)
- bootstrap treeview 增删改查 的正确姿势
- Spring取得*.properties文件属性
- The Python Tutorial(1)- Python教程
- python3 实现12306查询余票
- Knight Probability in Chessboard
- 骨牌覆盖