插入排序是一種簡單直觀且穩定的排序演算法,顧名思義,就是每次將待排序序列中的乙個數插入到已排序的數列中,也是非常有名的演算法。
洛谷1177 排序
題目描述
將讀入的 n 個數從小到大排序後輸出。
輸入格式
第 1 行為乙個正整數 n。
第 2 行包含 n 個空格隔開的正整數 a[i],為你需要進行排序的數,資料保證了a[i]不超過10^9。
輸出格式
將給定的 n個數從小到大輸出,數之間用空格隔開。
輸入輸出樣例
輸入
542
451
輸出
124
45
說明提示
對於20% 的資料,有 n <= 10^3。
對於100% 的資料,有 n <=10^5 。
備註
本來洛谷1177是需要用快速排序來求解的,但實在找不到用插入排序就能過的裸題,因此只好以這道題為例子了。這道題用插入排序實際上只能拿60分,因為插入排序效率較低。
我們先把陣列分成前後兩部分,前一部分1 ~ (i - 1)表示已經排序好的序列,i ~ n表示尚未排序的序列。每次取未排序序列中的首位,既a[i],把它插入到前面已排序好的序列之中。
具體一些就是,從(i - 1) 到1去列舉在已經排序好的序列中的位置j,直到a[j] < a[i]那麼j + 1就是我要插入的位置,因為如果說我要去插入的這個值a[i]是大於a[j]的,而且已知1 ~ j是有序的,那麼a[i]一定也大於a[1] ~ a[j - 1]。
後來人們又發現,我們可以在列舉j的時候,每次去判斷a[j]是否大於a[j + 1],如果是,就交換a[j]和a[j + 1],如果不是了就跳出迴圈。其中j就是我要插入的這個值當前的位置。
簡而言之,就是我們每次去把a[i]這個數往前移動一位,直到下乙個數比我小了,那麼我就到了我當前應該在的正確位置了,就可以停下迴圈了。這裡可能相對來說比較難理解,你可以自己動手去分析一下樣例。
最後算一下這個演算法的時間複雜度:我們需要先列舉i,再去列舉j,兩重迴圈,所以時間複雜度是o(n^2)級別的。但相對於選擇排序和氣泡排序,效率還是提高了一些的。(比如洛谷1177這道題,用選擇排序和氣泡排序只能拿20分,而用插入排序可以拿到60分)
# include
# include
# include
# include
using
namespace std;
const
int n_max =
100000
;int n;
int a[n_max +10]
;void
insertsort()
intmain()
插入排序演算法
插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第n個元素與前n 1個元素進行比較並將其插入合適位置。演算法 建立日期 2004 12 14 插...
演算法 插入排序
include include 插入排序 n 2為的效率。具體思想 將陣列分為兩部分,一部分是有序的,一部分為無序的 然後從無序中選取乙個數插入在有序的數中的恰當的位置,以此迭代,直到無序的數全部遍厲完畢 void insert sort int a,int n a j tmp break retu...
插入排序演算法
下面這段話摘自 一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將...