1. 程式人生 > >NOIP-C++大神培養計劃Step1.2.2——排序之插入排序

NOIP-C++大神培養計劃Step1.2.2——排序之插入排序

上一節課呢,我們學習了氣泡排序,今天我們就來學學插入排序。


先看一個圖

ee08799763dcc631d05f1c6d19bce83f7d13497a


很顯然,我們要選出一個數,並找到他的位置,就像圖中的一樣。


有過一定生活經驗的人會發現,這句就是打牌時的理牌嘛!


我們首先要用O(n)的時間來列舉每一個點,再用O(n)的時間查它之前在序列中的應有位置,所以,總複雜度是O(n^2)。


我們來看看程式碼:



#include<iostream>
using namespace std;
int n,a[10001],t,j,k;//迴圈之外要用的j,k 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		for(j=i-1;j>=0;j--)
			if(a[j]<a[i])//找到比a[i]小的位置就退出,插入其後 
				break;
		if(j!=i-1)
		{
			t=a[i];
			for(k=i-1;k>j;k--)
				a[k+1]=a[k];//位置前移一個 
			a[k+1]=t;
		}
	}
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}


這個程式碼看似和bubblesort氣泡排序很像,但是它的不同在於使用了全域性變數j,k來儲存a[i]應有的位置和現在所屬的位置。

有時候這個程式碼很難理解,但是理清思路,最後也是很好理解的。


程式碼的關鍵在於:


for(j=i-1;j>=0;j--)
if(a[j]<a[i]) 
	break;
if(j!=i-1)
{
	t=a[i];
	for(k=i-1;k>j;k--)
		a[k+1]=a[k];
	a[k+1]=t;
}

其實,說句實話,插入排序的運用真的不廣泛。只要懂得,不必太深究。


今天的課程就到這裡,明天我們要講選擇排序,我們明天見!