排序演算法入門——直接插入排序
阿新 • • 發佈:2019-02-08
時間複雜度
· 直接插入排序最好的時間複雜度為O(n)
· 直接插入排序的最壞時間複雜度為O(n^2)
· 因此直接插入排序總的平均時間複雜度為O(n^2)
注:具有穩定性
排序原理
雖然給出的排序數字為一個數組或者別的容器,但是排序的時候,就當是順序給你一個又一個數字,給你一個你排一個(類似於撲克牌,打牌的時候,你拿一張牌,你要排一下順序,看拿到的牌的大小,大的往後,小的直接插前面,但不同的是你拿到牌直接能看出來放哪,而在計算機裡的排序,必須先比較,前面已經排好的數字,你才知道放哪),直接插入排序就是按這個思想來走的。
測試截圖
要排序的數字為2,5,3,6,1,7
左邊是排好的數字,右邊是還沒排的,從這個排序過程可以看出,運算過程是取一個排一個,
以第二遍為例,2,5已經排好,下一個要排的是3,所以第三遍,3先跟5比較,3<5,所以,3跟2在比較,3>2,因此3放2,5之間。
c++(從小往大排)
#include<iostream> using namespace std; void directsort(int a[6],int n){ int temp; for(int i=1;i<n;i++){//不從0取是因為拿到第一個不用排,就像你不會拿第一張撲克就想排在哪裡 /* 中間註釋部分是上面截圖的執行過程展示,與排序過程無關 cout<<"第"<<i<<"遍 "; for(int k=0;k<i;k++){ cout<<a[k]<<" "; } cout<<" "; for(int b=i;b<n;b++){ cout<<a[b]<<" "; } cout<<endl; */ if(a[i]<a[i-1]){ //如若拿到的數字比排好序中最大的數小,就像上例3<5 temp=a[i]; //把要排序數字賦值給臨時變數 for(int j=i-1;j>=0&&a[j]>temp;j--){//這個過程相當於上例中,從5往前比較 a[j+1]=a[j];//把比要排序的數字大的都往後挪一位,給排序數字留出位置 , } a[j+1]=temp;//迴圈結束,把排序數字放到留的位置上 } } } void print(int a[6],int n){// for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl; } int main(){ int a[6]={2,5,3,6,1,7}; directsort(a,6);//排序 print(a,6);//輸出排好序的陣列 }