資料結構與演算法 十七 選擇排序

2021-09-22 18:28:50 字數 1868 閱讀 8335

選擇排序(selection sort)就是遍歷n-1次數組,每次從待排序的資料中找出乙個最小值或最大值,與第i位置上的資料進行交換。

首先我們需要乙個待排序的陣列 arr[10] = ,其中arr[0]=0用做哨兵或臨時變數所以不參與排序,所以陣列下標從1開始,有效長度len=9,實際長度為10。

然後我們還需要交換資料的操作:

void swap_arr(int *arr, int i, int j)

/*選擇排序演算法*/

void selection_sort(int *arr, int len)

if (min!=i) /*如果i剛好就是最小值,那就不用交換*/

swap_arr(arr, i, min); /*否則就交換到i位置*/}}

其實選擇排序的思路非常的好理解,**實現也非常簡單,下面給出前三輪迴圈的交換示意圖。 

通過分析選擇排序,知道它是乙個蘿蔔乙個坑的填法,是不區分最好情況和最壞情況的,內層迴圈次數還會逐輪遞減,所以選擇排序的時間複雜度o(n²/2)。

在所有情況下,選擇排序的效率都優於標準氣泡排序,效能是其的一倍,而優化後的氣泡排序僅在較好的情況下略優於選擇排序。

又要問了,標準的選擇排序是否還有優化的空間嗎?

因為選擇排序不區分最好情況和最壞情況,也無法每輪辨別是否已經完全排序好了,所以之前優化氣泡排序的思路用不了。

但是想一想,一次遍歷只找乙個最小值,是不是有些虧?我們還可以再找乙個最大值,這樣一輪就可以排序乙個最大值和乙個最小值,這個思路有點像雞尾酒排序對於氣泡排序的優化思路。

/*選擇排序優化演算法*/

void optimal_selection_sort(int *arr, int len)

if (min->data > q->data) min=q; /*q->next==end時會跳出,此時q就沒進行比較,所以多加一次比較*/

if (max->data < q->data) max=q; /*也可以使用while迴圈來優化這一段***/

end=q; /*end前移,等待這一輪最大值交換到此處*/

if (min!=p)

if (max!=end) /*最大值交換到end*/

swap_link(max,end);

if (end == p->next) break; /*為什麼會多出這一句?因為會出現:當這一輪p後移的時候,此時end還不等於p->next*/

} /*這一輪結束後,此時end可能會等於p->next,但是下一輪p是先後移再判斷*/

} /*此時p就會等於end,p->next!=end永遠不會跳出迴圈,所以要加這一句*/

鏈式儲存結構實現優化選擇排序,如果不使用length來實現,那麼需要增加乙個end指標來替代len-i+1的作用,其他實現思路與順序儲存結構實現優化選擇排序一模一樣,效能和效率也是一樣的。

資料結構與演算法 排序 選擇排序

資料結構與演算法 排序 選擇排序 sort selectsort include includevoid selectsort int list,int len if print list,len for selectsort int minkey int list,int i,int len if...

資料結構與演算法 選擇排序

選擇排序 從小到大 的基本思想是,首先,選出最小的數,放在第乙個位置 然後,選出第二小的數,放在第二個位置 以此類推,直到所有的數從小到大排序。在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。下面,以對 3 2 4 1 進行選擇排序說明排序過程,使用min index ...

資料結構與演算法 選擇排序

1 什麼是程式?程式 資料結構 演算法 2 選擇排序 selection sort 基本思想 我們從第乙個位置開始,依次和後面的值進行比較,如找到比第乙個值小的,二者進行交換。交換後第乙個位置的值已經確定下來,我們再從第二個位置開始,依次和後面的進行比較,依次類推,知道所有的值都比較完成,到此選擇排...