排序演算法 選擇排序及優化版本

2021-09-30 19:57:40 字數 912 閱讀 6988

在前邊的排序演算法(一)中已經分析過選擇排序,這裡主要是想講解他的優化版本。 

選擇排序,是通過每次選擇最小的數或者最大的數,然後將它放在它應該出現的位置上。 

具體實現過程:將0號下標的資料儲存,在之後的數中選擇乙個最小的數,如果最小的數不是0號數,則將最小的數與0號下標的數進行交換;將1號下標的數進行儲存,在之後的數中 選擇最小的數,如果最小的數不是1號數,進行交換。以此類推。 

下邊給出實現**:

void selectsort(vector& v)

if(k != i)

}}

這樣一來,對於每一趟,我們需要遍歷一遍,將找到的最小的數放在應該出現的位置,所以,選擇排序的時間複雜度是o(n*n),不管是最好情況還是最壞情況,找最小數的過程都需要遍歷一遍,所以,選擇排序最好情況也是o(n*n)。 

優化版本: 

根據上邊的分析,如果在每一次查詢最小值的時候,也可以找到乙個最大值,然後將兩者分別放在它們應該出現的位置,這樣遍歷的次數就比較少了,下邊給出**實現:

void selectsort(vector& a)

if(a[i] > a[max])

}swap(a[left],a[min]);

if(left == max)

max = min;

swap(a[right],a[max]);

++left;

--right;

}}

這樣總共遍歷的次數比起前邊的一般版本就會減少一半,時間複雜度是o(n/2 * n /2)還是o(n*n)。但是,**中,第一次交換結束後,如果left那個位置原本放置的就是最大數,交換之後,需要將最大數的下標還原。 

需要注意的是,每次記住的最小值或者最大值的下標,這樣方便進行交換。

選擇排序演算法及優化

選擇排序演算法的思路是 第一次將集合中最小的數挑選出來放在第乙個位置,第二次將集合中最小的數挑選出來放在第二個位置,依此類推。例如 我們需要對進行排序 經過第1次迴圈最小位置是 5 結果是 0,9,5,7,8,2,1,3,4,6 經過第2次迴圈最小位置是 6 結果是 0,1,5,7,8,2,9,3,...

氣泡排序,選擇排序,插入排序 c 演算法優化版本

氣泡排序 bubblesort.h 氣泡排序 created on 2020年2月10日 author luyonglei ifndef src bubblesort h define src bubblesort h include using namespace std if 0template...

排序演算法之選擇排序(Java 版本)

最近在看 演算法導論 半路出家的我看的著實頭痛,先記錄下心得,難得的好書。ps 看不懂的書才是好書?基礎內容描述 選擇排序是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法。實現private void selec...