直接插入排序
直接插入排序类似对扑克牌的整理,初始情况下把前面第一个看作有序序列,然后后面全是无序。
这个排序写过很多遍,但是每次回顾都感觉到设计者精彩巧妙的安排。
#include<iostream> #include<vector> using namespace std; //首先定义测试数组 这里对下标0处定义了一个哨兵, 然后从后往前遍历 //哨兵是为了从后往前遍历时候可以减少一次判断下标问题 int test[]={0,5,44,66,11,12,45,98,58,82}; //用数组初始化vector vector<int> test_v(begin(test),end(test)); //打印数组 inline void printv(const vector<int>& v) { for(auto a:v) cout<<a<<" "; cout<<endl; } //直接插入排序 void insert_sort(vector<int> &v) { cout<<"直接插入排序"<<endl; for(int i=2;i<v.size();i++) { v[0]=v[i];//为哨兵赋值 int j=0; //这里的J初始化在I前面一个位置 //开始从正序最后一个与要插入的比较 //假如要插入比当前正序[j]小则,j--然后把数据往后挪一个位置即可 for(j=i-1;v[0]<v[j];j--) { v[j+1]=v[j];/*v[0]已经保存了v[i]内容不怕被覆盖真是巧妙的想法*/ } //最后跳出循环时候,必然v[0]>v[j],我们只要v[j+1]=v[0]即可 v[j+1]=v[0]; } printv(v);//打印每次结果,便于观察 } int main() { insert_sort(test_v); return 0; }