经典算法---选择排序 selection sort

本文深入解析了选择排序算法,包括其工作原理、时间复杂度O(n^2)、稳定性及与冒泡排序的区别。通过C语言代码示例展示了选择排序的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择排序 selection sort

时间复杂度 O ( n 2 ) O(n^2) O(n2)

选择排序每一趟找出一个最小(或最大)数放到序列起始位置,然后再从剩余待排序元素中继续找到最小(或最大)数,放到已排序的序列的尾部,以此类推,直到全部待排序元素排完。

选择排序的思想和冒泡排序是类似的,但选择排序和冒泡排序是有区别的1

  1. 冒泡排序比较的是相邻两个数,而选择排序是顺序比较,找到最小(或最大)数。
  2. 冒泡排序每一轮的比较过程中,位置不对都要换,选择排序每轮比较只是找出最小(或最大)数的索引, 一轮查完后只换一次位置即可。
  3. 冒泡排序是稳定的(算法是否稳定见后面补充内容),因为当比较相邻两者时如果是一样的,那么不会调换位置,但是选择排序是不稳定的(同见补充内容)。

选择排序和冒泡排序的优劣:

  1. 选择排序由于一次只交换一次,所以比冒泡排序效率高些,但两者的总体时间复杂度都是 O ( n 2 ) O(n^2) O(n2),所以实际上我估计也快不到哪里去。
  2. 选择排序需要额外使用一个临时空间。
  3. 选择排序是不稳定的,但是冒泡排序是稳定的。

选择排序的C语言实现

void swap_arr(int arr[], int i, int j)
{
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void selction_sort(int arr[], int len)
{
    int i, j;
    int smallest_index;
    for(i = 0; i < len; i++)
    {
        smallest_index = i;
        for(j = i+1; j < len; j++)
        {
            if(arr[j] < arr[smallest_index])
            {
                smallest_index = j;
            }
        }
        swap_arr(arr, smallest_index, i);
    }
}

补充内容

算法是否稳定的判断标准:待排序的序列中有两个相等元素,排序后它们的顺序不变,为算法是稳定的,否则为算法不稳定。比如原序列中有两个相同的值: A i = A j A_i=A_j Ai=Aj i , j i,j i,j为索引下标,且 i &lt; j i&lt;j i<j,那么排序后还是 i &lt; j i&lt;j i<j

下面来看选择排序为什么是不稳定的。假如有一个序列: 3 , 2 , 3 , 1 , 4 3,2,3,1,4 3,2,3,1,4。该序列有两个3,第一趟排序,会交换第1个3和1的位置,这样排序后两个3的顺序就和原来就不一样了,所以选择排序是不稳定排序。

既然算法有稳定和不稳定之分,那么稳定的算法有什么好处呢?如果排序算法是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用,这样可减少开销,说基数排序就是这样的2,但是基数排序目前还没去研究,等哪天研究到了,再结合算法的稳定性做总结。

参考


  1. 排序算法:冒泡排序和选择排序的内容,区别与优缺点。 ↩︎

  2. 排序算法的稳定与不稳定 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值