SCAU 8640 希尔(shell)排序
Posted 吃花椒的妙酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SCAU 8640 希尔(shell)排序相关的知识,希望对你有一定的参考价值。
魔改后的选择排序
相当于将n个数分组后,再每组去选择排序
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
typedef long long ll;
const int N=1e5+10;
int n;
int a[N];
void print()
{
_for(i,1,n) cout<<a[i]<<" ";
cout<<endl;
}
void shell(int d)
{
for(int i=1+d ;i<=n ;i++)
{
int temp = a[i];//记录当前元素
//找到插入位置
int j = i-d;//前面一个元素
while( temp < a[j] && j>=1 )//找到第一个≥temp的位置
{
j -= d;
}
int k = j+d;
//找到后将它后面的元素向后移动“一位”d
for(int j=i ;j>k ;j-=d)
{
a[j] = a[j-d];
}
//放置到正确位置上
a[k] = temp;
}
}
signed main()
{
///!!!
// freopen("data.txt","r",stdin);
//!!!
cin>>n;
_for(i,1,n) cin>>a[i];
int d=n>>1;
while( d )
{
shell(d);
//增量每次减半
d/=2;
//输出一趟排序后的序列
print();
}
}
以上是关于SCAU 8640 希尔(shell)排序的主要内容,如果未能解决你的问题,请参考以下文章