選擇排序和氣泡排序

2021-08-15 22:37:12 字數 2982 閱讀 7551

**選擇排序

在用圖來講解選擇排序之前,我們要先了解選擇排序的規則。

選擇排序的規則

就是重複執行以下的處理:

1.找出未排序部分最小值的位置min。

2.將min位置的元素與未排序部分的起始元素做對比,如果順序錯誤則將它們進行就交換。

以陣列a=為例,我們對其進行從小到大排序,排序過程如下圖所示。

首先我們找到未排序部分最小的值a[6]=1和未排序的起始元素a[0]=5相比較,發現a[6]的值更小,則將兩個數進行交換,以此類推。

最終得到的結果為a=

實現選擇排序

接下來要實現插入排序,針對下圖來定義變數。

如上圖所示,i為迴圈變數,代表未排序部分的開頭元素; j為迴圈變數,用來遍歷未排序部分找出最小值min。

接下來我們用**來實現選擇排序,如下所示。

public

class

selectionsort ;

arrayutils.printarray(a);

intb = selection(a);

arrayutils.printarray(b);

}public

static

intselection

(int

a) }

v = a[i];

a[i] = a[min];

a[min] = v;

}return

a; }

}

其中負責列印陣列的arrayutils類如下所示。

public

class

arrayutils

}system.out

.println("}"

); }

}

輸出結果為:

選擇排序複雜度

假設資料總數為n,則為了搜尋未排序部分最小的的值需要(n-1)+(n-2)+(n-3)+……+1次比較,也就是n²/2+n/2次比較,因此時間複雜度為o(n²)。同樣的,此前講過的插入排序和氣泡排序的時間複雜度也是o(n²)。它們的區別就是:不含flag的冒泡演算法和選擇排序並不依賴於比較運算的次數,不受輸入資料的影響,而插入演算法卻依賴於比較運算的次數,處理某些資料時會具有很高的效率。

氣泡排序應該是開發者最容易理解的排序演算法,它的基本思想就是每次比較兩個相鄰的元素,如果它們的順序錯誤就把它們交換過來。需要進行排序的元素則向水中的氣泡一樣慢慢的移向水面。

**氣泡排序

與選擇排序一樣,需要進行氣泡排序的陣列也分為已排序部分和未排序部分。

氣泡排序的規則為:從陣列末尾開始依次比較相鄰的兩個元素,如果大小關係相反則交換位置,直到陣列中不再有順序相反的相鄰元素。

我們對陣列 a= 進行從小到大排序,排序過程如下所示。

第一輪排序:

我們將陣列末尾的a[4]的值和a[3]的值進行對比,發現a[4]的值比a[3]的值小,則將它們交換,再接著對剩下的相鄰的兩個元素進行對比和交換,最終得到的結果為a=,已排序的部分的元素為1。

第二輪排序:

首先對比a[3]和a[4]的值,發現a[3]的值比a[4]的值小,則不需要進行排序。最終得到的結果為a=,已排序部分的元素為1、2。

第三輪排序:

經過第三輪排序,已排序部分的元素為1、2、3。

第四輪排序:

經過四輪排序我們最終得到的結果為a=

實現氣泡排序

實現插入排序時,我們要先定義兩個變數,i為迴圈變數,表示未排序部分的開頭元素,從陣列開頭向末尾移動。j也為迴圈變數,用於對未排序部分中相鄰元素兩兩比較,從陣列的末尾n-1開始減小到 i 結束(i=1)。

**實現如下所示。

public

class

bubblesort ;

arrayutils.printarray(a);

intb = bubble(a);

arrayutils.printarray(b);

}public

static

intbubble

(int

a) }

}return

a; }

}

其中arrayutils的printarray方法此前講過,這裡就不再給出,列印結果為:

氣泡排序的複雜度

最壞的情況下,氣泡排序對未排序部分的相鄰元素進行了(n-1)+(n-2)+(n-3)+……+1次比較,也就是n²/2-n/2次比較,根據推導大o階的規則我們得出氣泡排序的時間複雜度為o(n²)。

排序 氣泡排序和選擇排序

目錄 氣泡排序 氣泡排序原理圖 demo 執行 選擇排序 氣泡排序原理圖 demo 執行 說明 include include using namespace std name 氣泡排序法 number 傳入陣列 length 陣列長度 setw 需要匯入 include ps 這是乙個lib.h的...

選擇排序和氣泡排序

選擇排序和氣泡排序 演算法 蠻力法選擇排序,第一次掃瞄整個陣列,找到最小元素,然後和第乙個元素交換。第二次從第二個元素開始掃瞄陣列,找到剩下的元素中最小的與第二個元素交換位置,直到最後。89 45 68 90 29 3417 17 45 68 902934 89 17 29 68 90 453489...

選擇排序和氣泡排序

選擇 從小到大排序 int a 5 a 0 a 1 a 2 a 3 a 4 5 4 3 2 1 1 5 4 3 2 第一輪比較 拿a 0 和後面的元素依次比較 如果a 0 a i 那麼兩個數交換 1 2 5 4 3 第二輪比較,拿a 1 和後面的元素依次比較,如果a 1 a i 那麼兩個數交換 1 ...