直接插入排序類似於我們平常在打撲克摸牌時候的一種情形。我習慣於左手拿牌右手摸牌,每次先把左手中的牌齊整齊,然後右手新摸一張牌中把它放到左手中正確的位置,讓它成為乙個新的整齊的牌堆。
如果根據上面的思路我們可以發現,直接插入排序的思想就是,從需要排序的第二個數字開始,拿取乙個數,與前面的數字進行比較,放在合適的位置,使之成為乙個新的有序陣列。
直接插入排序c**如下:
# includevoidsort(int *a,int len)
a[i+1] = t; //把插入的數字放在特定的位置,讓其成為乙個新的有序陣列
} }}
intmain(void);
sort(a,10);
for(i=0;i<10;i++)
}
我們來看下插入排序的時間複雜度,我們這裡先假設是最優的情況,比如有陣列,本身就是已經排好序的了,那麼比較次數為5-1=4,移動次數為0。所以可以推出原始的輸入序列為正續的n個陣列,那麼它的比較次數為n-1,移動次數為0。這裡我們再來看下最差情況,比如有陣列,那麼它的比較次數為1+2+3+4,移動次數為1+2+3+4+5-1,所以我們可以推出n個逆序陣列的比較次數為n(n-1)/2,移動次數為n(n-1)/2+ n -1(注意多的n-1是因為每次需要發生移動的話,插入的數字本身也要移動)。如果是隨機的情況下,根據概率論,我們可以推斷出,移動次數和比較次數的平均約為n*n/4,所以直接插入排序演算法的時間複雜度為n*n。
雖然直接插入排序的時間複雜度和氣泡排序和比較排序來說是一樣的,但是直接插入排序的效能相對來說比上面的兩種情況都要好點,建議在待隨機排序的資料小於30個的時候,都使用插入排序。
排序演算法 插入排序之直接插入排序
直接插入排序的核心思想是把乙個記錄插入乙個有序序列中,每插入乙個記錄就得到乙個新的有序序列,直到所有記錄都插入成功,得到有序序列。每次插入記錄時的有序序列如何得到,關鍵在第一次,第一次要插入的記錄時序列的第二個值,有序序列只有乙個值,就是第乙個記錄。a j 1 x j 1就是要插入的位置 print...
排序演算法之直接插入排序
直接插入排序 straight insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 其中紅色區域為有序區域 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 a 0 a ...
排序演算法之直接插入排序
基本思想 直接插入排序的思想非常簡單,將序列中第乙個元素作為乙個有序序列,然後將剩下n 1個元素按關鍵字大小依次插入該有序序列,每插入乙個元素後依然保持該序列有序,經過n 1趟排序後即成為有序序列。直接插入排序示例 由圖可以看到,括號裡面的都是有續表,而貨號後面的灰色關鍵字是下乙個將要插入的元素。v...