C++代码,数据结构-内部排序-插入排序-Shell排序
来源:互联网 发布:范冰冰 知乎 编辑:程序博客网 时间:2024/05/29 10:51
希尔排序,又称缩小增量排序,在时间效率上较前几种插入排序类的方法有较大的改进
我们都知道直接插入排序的效率取决于序列的初始状态,而希尔排序可以通过巧妙的方法将序列经过几趟排序,使得序列在进行一次直接插入排序的时候效率大大的增加,
对于希尔排序,我目前的认识也只能达到可以写出算法,已经基本理解此算法,但更深的理解还是没有的,只是觉得很巧妙。
而我绝对shell排序的核心就是在直接插入排序之前,对序列进行一次有用的处理,
#include<iostream>using namespace std;//第十章 内部排序//Shell排序,先将待记录序列分割成若干个子序列分别进行插入和排序,待整个序列基本有序再对全体进行一次直接排序,//待排记录数据的数据结构#define maxsize 20struct redtype{int key;};struct Sqlist{redtype r[maxsize];int length;};int buildsq(Sqlist &sq){int x;cin>>x;sq.length=x+1;for(int i=1;i<=x;++i){int p;cin>>p;sq.r[i].key=p;}return x;}void Shellinsert(Sqlist &sq,int dk){//增量为dk的一趟排序,一趟排序使得被dk分隔的序列有序for(int i=1+dk;i<=sq.length-1;++i){//从dk+1开始,到最后一个元素,分别与其位置向前dr的元素比较if(sq.r[i].key<sq.r[i-dk].key)//如果i元素比i-dk位置处的元素小{ sq.r[0].key=sq.r[i].key; int j; for( j=i-dk;j>0&&sq.r[0].key<sq.r[j].key;j-=dk){//把i处元素,插入到i-dk,i-2dk,直到i-ndk<=0;的序列中,使其有序, sq.r[j+dk].key=sq.r[j].key; } sq.r[j+dk].key=sq.r[0].key;//插入}}}void Shellsort(Sqlist &sq,int dlta[],int n){//分别取增量序列里的数字进行一趟排序for(int k=0;k!=n;++k){Shellinsert(sq,dlta[k]);}}int main(){ Sqlist sq; int t= buildsq(sq);int dlta[]={9,5,3,2,1};//增量序列,可以有多种取法,但最后一个必须是1int n=5;Shellsort(sq,dlta,n);for(int i=1;i<=t;++i){ cout<<sq.r[i].key<<" ";}return 0;}
运行结果与前面几次一样。
0 0
- C++代码,数据结构-内部排序-插入排序-Shell排序
- C++代码,数据结构-内部排序-插入排序-直接插入排序
- C++代码,数据结构-内部排序-插入排序-折半插入排序
- C++代码,数据结构-内部排序-插入排序-表插入排序
- C++代码,数据结构-内部排序-插入排序-2-路插入排序
- 插入排序 --C数据结构
- 冒泡排序、快速排序、选择排序、插入排序、shell排序C代码
- 内部排序-插入排序
- 内部排序系列 之 插入排序与shell(希尔)排序
- 插入排序-【Shell排序】
- 插入排序-Shell排序
- 数据结构 排序 插入排序
- 【数据结构】:排序--插入排序
- 数据结构(C#)_排序算法(插入排序)
- 数据结构(C#)_排序算法(插入排序)
- C++代码,数据结构-内部排序-交换排序-起泡排序
- C++代码,数据结构-内部排序-交换排序-快速排序
- C++代码,数据结构-内部排序-选择排序-堆排序
- 黑马程序员之java类加载器和java中的反射机制学习
- opencv 中图像处理的一般流程——面向对象
- LogBack小记
- 120、php中foreach()用法
- oracle 11g 手动启动服务
- C++代码,数据结构-内部排序-插入排序-Shell排序
- 一些关于jdbc的小知识点
- final类型
- DRP之JSP HelloWorld
- 打印命令行参数,涉及的问题
- 初步学习和使用SQL Developer
- lua require 搜索路径
- java的存储空间和按值传递
- poj2185 Milking Grid 二维kmp