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