选择排序 - acgtyrant/Algorithm-and-Data-Structure GitHub Wiki

从今天开始,重启久违的数据结构与算法之道!虽然如今学生时代早就落幕,但关键是初衷与快乐。最近刚学 Python 得差不多了,也不急于参与开源项目。就用 Python 重新实现一遍玩玩吧,也是挖掘 Python 特性的好机会。

意外地,我在本维基上没找到对选择排序的 C++ 实现解说,但现在的重点是 Python, 于是在这里只贴代码了事:

#ifndef SELECTION_SORT_H_
#define SELECTION_SORT_H_

#include <algorithm>

template <typename ForwardIterator>
void SelectionSort(
    ForwardIterator first,
    ForwardIterator last) {
  for (auto iterator = first; iterator != last; ++iterator)
    std::iter_swap(iterator, std::min_element(iterator, last));
}

#endif // SELECTION_SORT_H_

我发现,Python 不愧是动态语言,泛型天生就大显神威。我们不用关心传入的参数是什么,只要它真如同 sequence 字面上的意思,即和 built-in sequence type 一样,可索引可切片等:

def selection_sort(sequence):
    for index, element in enumerate(sequence):
        min_element = min(sequence[index:])
        min_index = sequence.index(min_element)
        sequence[index], sequence[min_index] = min_element, element

此外用到的特性还有 enumerate, 可以同时返回索引值和对应的值,话说现在看来 C++ 的 iterator 抽象更胜一筹,毕竟可以表示迭代又表示对应的值(只需加 * 前缀);接着用泛型函数 min 和 sequence 类型方法 index 可以得到 min_elementmin_index; 最后是 Pythonic 的 swap 了。

PS: 我发现模块名居然不能包含划线符。

⚠️ **GitHub.com Fallback** ⚠️