數據結構-排序-直接插入排序
阿新 • • 發佈:2018-05-21
回顧 撲克牌 整理 是個 ack sort pan ID ostream
直接插入排序
直接插入排序類似對撲克牌的整理,初始情況下把前面第一個看作有序序列,然後後面全是無序。
這個排序寫過很多遍,但是每次回顧都感覺到設計者精彩巧妙的安排。
#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; }
直接插入排序是一種穩定排序;
但是當數據量大的時候,效率會打打降低。
按照特性,最好情況下,每次只要比較一次,移動2次。分別是v[0]的初始化和v[j+1]=v[0];總的比較次數為2(n-1).
所以好情況下時間復雜度為0(n)
最壞情況下,每次要比較正序所有數字+v[0]的哨兵位,第一次是2然後3 4 5。。。。n。毫無疑問這是個平方階
所以最壞情況是O(n^2);
數據結構-排序-直接插入排序