希尔排序法

来源:互联网 发布:ubuntu登陆界面鼠标 编辑:程序博客网 时间:2024/05/16 05:51

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_D

一种算是优化的插入排序
一般是每次从半数之后的范围进行插入,这样可以减少总的交换量。达到快速的效果

但是最后一定要让开始的位置变成1 也就是g数组的最后一个一定要是1

#include <bits/stdc++.h>using namespace std;long long g[10000005];long long a[10000005];long long cnt;long long isort(long long a[],long long n,long long g){    for(long long i=g;i<n;i++)    {        long long v=a[i];        long long j=i-g;        while(j>=0&&a[j]>v)        {            a[j+g]=a[j];            j=j-g;            cnt++;        }        a[j+g]=v;        //cout<<cnt<<endl;    }}void shellsort(long long a[],long long n,long long m){    cnt=0;    for(long long i=0;i<m;i++)    {        isort(a,n,g[i]);    }}int main(){    long long n;    cin>>n;    for(long long i=0;i<n;i++)    {        cin>>a[i];    }    long long l=0,e=n;    while(e>0)//一般是取1/2    {        g[l]=e;        e/=2;        l++;    }    cout<<l<<endl;    for(long long i=0;i<l;i++)    {        cout<<g[i]<<' ';    }    cout<<endl;    shellsort(a,n,l);    cout<<cnt<<endl;    for(long long i=0;i<n;i++) cout<<a[i]<<endl;}
原创粉丝点击