1. 程式人生 > >排序演算法入門——直接插入排序

排序演算法入門——直接插入排序

時間複雜度

·        直接插入排序最好的時間複雜度為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);//輸出排好序的陣列
}