插入排序與冒泡排序的區別


對於選擇排序和冒泡排序的基本概念 

(一)冒泡排序

    基本思想:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。由於在排序過程中總是小數往前放,大數往后放,相當於氣泡往上升,所以稱作冒泡排序。主要通過兩層循環來實現。

代碼實例:

      

 1   public int[] BubblingSort(int[] arr)
 2         {
 3             for (int i = 0; i < arr.Length; i++)
 4             {
 5                 for (int j = 1; j < arr.Length-i; j++)
 6                 {
 7                     if (arr[j] >arr[j - 1])
 8                     {
 9                         int temp = arr[j];
10                         arr[j] = arr[j - 1];
11                         arr[j - 1] = temp;
12                     }
13                 }
14             }
15             return arr;
16         }
View Code

(二)插入排序

   基本思想:插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,是穩定的排序方法。

代碼實例:

 1         public int[] InsertSort(int[] arr)
 2         {
 3             for (int i = 1; i < arr.Length; i++)
 4             {
 5                 int k = arr[i];
 6                 int j = i;
 7                 while (j > 0 && arr[j - 1] > k)
 8                 {
 9                     arr[j] = arr[j - 1];
10                     j--;
11                 }
12                 arr[j] = k;
13             }
14             return arr;
15         }
View Code

 

這里重點說下兩種排序方法的區別

假設有這樣一個數組為 int []list=new list[]{1,2,3,4}; 我們要對其進行升序排序(很顯然 這里已經是符合要求的升序排列).

現在 假若我們用冒泡排序 大概流程會是這樣:

1.先將1,2進行比較 無須替換 然后2,3比較 無須替換 然后3,4比較 無須替換 完成第一輪冒泡 比較次數為3次

2.將2,3進行比較 無須替換 然后3,4進行比較 無須替換  完成第二輪冒泡 比較次數為2次

3.將3,4進行比較 無須替換 完成第三輪冒泡 比較次數為1次

很顯然 我們沒有移動一次數字 但是卻比較了6次

再來看看插入排序如何實現 其詳細步驟為:

1.先設定1為有序區間 將2和1比較 無須移動 比較一次

2.此時1,2均為有序區間 將3和2進行比較 無須移動 直接跳出while循環 比較一次

3.此時1,2,3均為有序區間 將4和3進行比較 無須移動 直接跳出while循環 比較一次

很顯然 我們也沒有移動數字 但是只比較了3次

總的來說 冒泡排序 循環一次 就確定了第0位為最小值(針對升序)  而插入排序 循環一次 則將有序區間增加一位

因此 針對部分有序的集合來說(這里說的有序 是指與我們想得到的順序一致)  插入排序效率優於冒泡排序

但是我們可以針對冒泡排序進行優化   當我們循環某一次 發現沒有任何數字移動的時候 我們就已經知道 集合已經排序完成 而無須再進行循環

示例代碼:

 1   public int[] BubblingSort(int[] arr)
 2         {
 3             //集合中數字是否移動過
 4             bool flag = true;
 5             for (int i = 0; i < arr.Length; i++)
 6             {
 7                 if (flag)
 8                 {
 9                     for (int j = 1; j < arr.Length - i; j++)
10                     {
11                         flag = false;
12                         if (arr[j] > arr[j - 1])
13                         {
14                             flag = true;
15                             int temp = arr[j];
16                             arr[j] = arr[j - 1];
17                             arr[j - 1] = temp;
18                         }
19                     }
20                 }
21                 else
22                 {
23                     break;
24                 }
25             }
26             return arr;
27         }
View Code

此時的冒泡排序 循環次數和插入排序一樣 均為3次

 

 如果這篇文章能夠給與您幫助 不妨點個推薦吧!


免責聲明!

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



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