排序算法:选择排序 (C, C++, Python)

选择排序

排序算法老问题了,给定一个(可能)无序数组,将所有元素按升序或降序排好。选择排序是三大基础算法,对我而言是最早想到的方法。

思路

比较简单就不费墨水了,主要是想把算法都写成博客…将数组前段看成已排序部分,后段看成未排序部分,每一次循环从未排序部分找出最小的放在已排序部分末尾,直到完成。
两层循环嵌套,时间复杂度为 O(n^2),空间复杂度1,不稳定排序。
流程:
初始全部乱序,找到最小的 -4
在这里插入图片描述
交换最小的元素到前面,绿色表示已排序部分
在这里插入图片描述
乱序部分最小为 -2,交换到前面
在这里插入图片描述
按这样操作到完就行

C/C++ 写法

C/C++ 通用,因为是传入指针,为了方便先计算好数组长度。

void selectSort(int* num, int len)
{
	int idx, mid;
	for (short i = 0; i < len-1; i++)
	{
		idx = i;
		// 找最小元素下标
		for (short n = i; n < len; n++)
			if (num[n] < num[idx])
				idx = n;
		// C/C++ 交换需中间变量
		mid = num[i];
		num[i] = num[idx];
		num[idx] = mid;
	}
}

Python 原始写法

按着传统写法来的。

# coding=utf-8


def select_sort(num):
    # 下一个插入位置为 i
    for i in range(len(num)-1):
        min = i
        # 找到混乱中最小的,记住下标
        for n in range(i, len(num)):
            if num[n] < num[min]:
                min = n
        # Py 可以直接交换
        num[i], num[min] = num[min], num[i]
    return num


# 示范
num = [17, 1, 1, 3, 0, -2, -2.5, 0, 9]
select_sort(num)
print(num)

Python 魔幻写法

其实就是用了点 Py 特性,少一层循环。

# coding=utf-8


def select_sort(num):
    for i in range(len(num)-1):
        # 找到混乱中最小的
        mini = min(num[i:])
        # 用到了列表分割,所以下一个移动的值下标是 idx+i
        idx = num[i:].index(mini)
        # 删掉混乱中最小的,再加在有序的末尾
        num.pop(idx+i)
        num.insert(i, mini)


num = [17, 1, 1, 3, 0, -2, -2.5, 0, 9]
select_sort(num)
print(num)

结尾

自带的 sort 不香么?另外选择排序也比较适用于链表,就不写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值