十大经典排序算法之"选择排序"

选择排序的工作原理简单直观,和冒泡排序也有异曲同工之处,它将需要排序的数组分为有序区和无序区,首先在无序区选出最小的数,放到有序区的末尾(有序区为从小到大排序好的数组,因此此时从无序区选出的最小的数一定大于有序区中最大的数),以此类推,直到数组有序。

算法描述

  • 初始状态:无序区为原始数组 a r r [ 1 , . . . , n ] arr[1,...,n ] arr[1,...,n],有序区为空;
  • i ( i = 0 , 1 , . . . , l e n ( a r r ) − 1 ) i(i=0, 1, ..., len(arr)-1) i(i=0,1,...,len(arr)1)次排序开始,当前的有序区为 a r r [ 1 , . . , i ] arr[1, .., i] arr[1,..,i],无序区为 a r r [ i + 1 , . . , n ] arr[i+1, .., n] arr[i+1,..,n],然后在无序区选出最小的数,放到有序区的末尾(有序区为从小到大排序好的数组,因此此时从无序区选出的最小的数一定大于有序区中最大的数,所以放在有序区的末尾)
  • 重复上述步骤,直到排序结束。
时间复杂度 (平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性
O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定

代码描述

同冒泡排序类似,选择排序也包含两层循环,一层是在无序区中找到最小的数,一层是除了已经排好的较小的数(有序区)之外,重复比较排序,比较过程如下图所示(图比较粗糙,见谅~~):
选择排序过程
拿图中第三行来举例,[4, 5, 10]被认为是有序区,[7, 8]为无序区,从无序区中找到了最小数7,放入到有序区的末尾,后来的步骤以此类推。
不多说了,python实现的代码如下:


def selection_sort(arr):
    if len(arr) == 0 or arr is None:
        return None

    for i in range(len(arr)-1):     # 只需要 lne(arr)-1 次选择排序
        minIndx = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[minIndx]:
                minIndx = j
        arr[i], arr[minIndx] = arr[minIndx], arr[i]
    return arr

if __name__ == '__main__':
    arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(selection_sort(arr))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值