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

排序算法:选择排序

  • 选择排序
    • 思路
    • C/C++ 写法
    • Python 原始写法
    • 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 不香么?另外选择排序也比较适用于链表,就不写了。

你可能感兴趣的:(排序算法)