1. 程式人生 > >數據結構-排序-直接插入排序

數據結構-排序-直接插入排序

回顧 撲克牌 整理 是個 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);

數據結構-排序-直接插入排序