簡單選擇排序
1. 原理
-
以升序排序爲例:首先需要定義一個值k,表示最小的小標,假設第一個數時最小的,把第一個數據下標賦值給K = 0;然後依次讓後面的數據和a[k]相比,比它小的就將其值賦給K。後面依次如此,比較完畢後,判斷數據i是否和k相等,如果不相等,則表明後面有比a[i]小的值,然後將其與a[i]交換,此時,數組中第一個元素就是最小值了。然後將 k = i+1,繼續循環比較。舉個列子:
-
比如說有5個數字 5,4,3,2,1
定義一個k = 0;
首先k 指向第一個元素;
-
i = 0;i < 5;j < 5
k = 0,
j = 1; a[0] > a[1],成立,k = j = 1;
j = 2; a[1] > a[2],成立,k = j = 2;
j = 3; a[3] > a[2],成立,k = j = 3;
j = 4; a[4] > a[1],成立,k = j = 4;
內存循環完成,k = 4,i = 0,k != i,交換a[k]和a[i]的值
交換完成後,{1,4,3,2,5} -
i = 1;i < 5;j < 5
k = 1,
j = 2;a[1] > a[2],成立,k = j = 2
j = 3;a[2] > a[3],成立,k = j = 3
j = 4;a[3] > a[4],不成了
內存循環完成,k = 3,i = 1,k!= i,交換a[k]和a[i]的值
交換完成後,{1,2,3,4,5} -
i = 2;i < 5;j < 5
k = 2,
j = 3,a[2] > a[3] ,不成立
j = 4,a[2] > a[4],不成立
內存循環完成,k = 2, i = 2,k == i,不交換a[k]和a[i]的值
數組內容依舊爲{1,2,3,4,5} -
i = 3; i < 5;j < 5
k = 3;
j = 4, a[3] > a[4] ,不成立 -
i = 4;i < 5;j < 5
k = 4;
j = 5; j < 5,不成立,退出內存循環
k = 4,i = 4 ,k == i ,不交換a[k]和a[i]的值
i++==>i = 5,循環結束。最終a[5] = {1,2,3,4,5}
- 接着重新讓k指向第二個數的下標,開始下一輪循環
二、實現實現代碼講解
void simple_select_sort(int a[],int len)
{
int i,j,k;
for(i = 0;i < len -1 ;i++)
{
k = i;
for(j = i + 1; j < len;j++)
{
if(a[j] < a[k])
k = j; //尋找到最小的值
}
if(i != k) //如果i的值不等於k即存在比a[i]小的值,將該值插入到a[i]位置
{
a[i] ^= a[k];
a[k] ^= a[i];
a[i] ^= a[k];
}
}
}
三、總結
- 簡單選擇排序的時間複雜度和冒泡排序的時間複雜度是一樣的,都是O(n^2),且是穩定的。