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; }
我这里把每个步骤都打印了出来,运行就可以得到这种结果
看看就知道每次操作了