数据结构-排序-shell排序

              shell排序

首先,希尔排序适用于待排序列关键有序。

接下来一步步图解SHELL排序

我为了方便理解内部操作。我先把代码输出整理下。

#include<iostream>
#include<vector>
using namespace std;
//同样第一个是哨兵,用来存放比较的内容。毕竟SHELL排序就是升级版的直接插入排序
//含暂存单元的数组v
int temp[]={0,20,17,36,98,14,23,83,13,28};
vector<int>  v(begin(temp),end(temp));

//打印数组
inline void  printV(const vector<int> &v)
{
    for(auto a:v)
        cout<<a<<" ";
    cout<<endl;
}
//shell排序
void shell_sort(vector<int> &v)
{
    cout<<"shell排序"<<endl;
    for(int d=v.size()/2;d>=1;d=d/2)//分割区间,直到区间=1
    {
        cout<<"循环1开始"<<endl;
        for(int i=d+1;i<v.size();i++)//第二个分区首部   分组后对组开始直接插入排序
        {
            cout<<"循环2开始"<<endl;
   cout<<"设置哨兵"<<endl; v[
0]=v[i]; //以一分区尾部设置哨兵 int j; //设j=i-d j为一分区首部,假如当前有序组v[j]比无顺组中v[0]大,则开始直接插入排序 for(j=i-d;j>0&&v[0]<v[j];j=j-d) { cout<<"循环3开始"<<endl; printV(v); v[j+d]=v[j]; cout<<"循环3结束"<<endl; } //把哨兵插入j+d cout<<"哨兵插入"<<endl; v[j+d]=v[0]; printV(v); cout<<"循环2结束"<<endl; } cout<<"循环1结束"<<endl; } printV(v); } int main(int argc, char *argv[]) { printV(v); shell_sort(v); return 0; }

我这里把每个步骤都打印了出来,运行就可以得到这种结果

看看就知道每次操作了

转载请标明出处
原文地址:https://www.cnblogs.com/DJC-BLOG/p/9068864.html