NOIP-C++大神培養計劃Step1.2.2——排序之插入排序
阿新 • • 發佈:2018-12-04
上一節課呢,我們學習了氣泡排序,今天我們就來學學插入排序。
先看一個圖
很顯然,我們要選出一個數,並找到他的位置,就像圖中的一樣。
有過一定生活經驗的人會發現,這句就是打牌時的理牌嘛!
我們首先要用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;
}
其實,說句實話,插入排序的運用真的不廣泛。只要懂得,不必太深究。
今天的課程就到這裡,明天我們要講選擇排序,我們明天見!