算法分析:什么是插入排序?


什么是插入排序?

 

同樣,插入排序會涉及到兩個區域:

  • 有序區域。有序區域內的元素,元素從小到大分布(或者從大到小分布)。在開始排序之前有序區域為第一個元素
  • 無序區域。無序區域內的元素,元素任意分布,在開始排序之前除了第一個元素之外的所有元素都處在無序區域內。

 

插入排序,在無序區域內根據順序取出每一個元素X。在有序區域內從后往前尋找合適元素X的位置,保證插入后,元素X與有序區域內的其他元素依然組成有序區域。

 

 

我想用一組數據來闡述插入排序的過程。元素6處於無序區域內,除了元素6以外的其他元素處於無序區域內。

  • 第一輪排序開始,從無序區域內找到第一個元素3,和有序區域內的從最后一個元素開始比較。直到元素3找到合適的位置插入,和有序區域的其他元素一起組成有序區域。由於3 < 6。 6之前沒有其他元素。因此6和3交換位置。

  • 第二輪排序開始,從無序區域內找到元素2,和有序區域內的從最后一個元素開始比較。知道元素2找到合適的位置插入,和有序區域的其他元素一起組成有序區域。由於2<6,同時2<3。元素3又是第一個元素。因此元素2在元素3之前的位置插入。

 

...

依次類推。

  • 在插入排序之前,第一個元素認為在有序區域內。
  • 每進行一輪排序。有序區域的元素個數增加1。
  • 總共需要進行(元素總個數-1)輪排序。

最后我們使用Java代碼來展示上述的算法。

 1 private static void sort() {
 2 
 3         Integer[] data = {6,3,2,1,8,9,7,5};
 4 
 5         for(int i=1; i<data.length; i++) {
 6 
 7             //無序區域中,最左邊的元素
 8             int compare = data[i];
 9             //有序區域中,最右邊的元素
10             int m = i - 1;
11 
12             while(m >= 0 && data[m] > compare) {
13                 data[m+1] = data[m];
14                 m--;
15             }
16             data[m+1] = compare;
17         }
18 
19 
20 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM