C語言排序算法--簡單選擇排序

簡單選擇排序

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 指向第一個元素;

  1. 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}

  2. 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}

  3. 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}

  4. i = 3; i < 5;j < 5
    k = 3;
    j = 4, a[3] > a[4] ,不成立

  5. 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}

  1. 接着重新讓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),且是穩定的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章