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