排序算法:选择排序
选择排序
排序算法老问题了,给定一个(可能)无序数组,将所有元素按升序或降序排好。选择排序是三大基础算法,对我而言是最早想到的方法。
思路
比较简单就不费墨水了,主要是想把算法都写成博客…将数组前段看成已排序部分,后段看成未排序部分,每一次循环从未排序部分找出最小的放在已排序部分末尾,直到完成。
两层循环嵌套,时间复杂度为 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 不香么?另外选择排序也比较适用于链表,就不写了。