Python 算法之选择排序

前言

算法一直是程序员想要进阶必经之路,也是很多大厂所要求掌握的能力之一。我在算法的学习上可以说非常的笨,最初这么学也学不好。但在自己参考了很多优秀的文章,逐渐发现自己也能慢慢理解算法。慢慢也能手写一些算法。最近我在用 Python 把自己曾经学过的算法,再次重温。今天要教大家的是一个最基础的算法「Selection Sort」。

选择排序 Selection Sort

一个非常经典 O(n^2) 的算法。Selection Sort 是一种简单直观的排序算法。它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素。放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

有关算法的文字描述信息,对于初学者来说非常的头疼。我最开始学算法的时候也是一样。一直理解不了其中的含义,导致自己每次写算法时,总是不能完整写出来。这需要你静下心来,反复的阅读理解。结合动态图可以让你更好的理解算法。

排序效果

Selection_sort_animation

实现代码

selection_sort

代码非常的简单,只有短短的 10 行。但是要真正的理解却并不容易。接下来我通过每行代码来进行见解。

defselection_sort(list):

第一行定义一个选择排序函数,给它传入一个参数,用来接收我们要处理的数据。

defselection_sort(list):

n = len(list)

第二行获取需要处理的数据的长度,比如有个队列 list = [1, 2, 3, 4],那 n = 4.

defselection_sort(list):

n = len(list)

foriinrange(, n -1)

第三行从零开始循环数据直至最后一个元素,由于 python 的数据第一个元素下标为零,所以数据的最后位置要减一,即 n - 1。

defselection_sort(list):

n = len(list)

foriinrange(, n-1):

min_index = i

第四行假设第一个元素是当前数据最小元素,我们通过 min_indext 来记录最小元素的下标。

defselection_sort(list):

n = len(list)

foriinrange(, n-1):

min_index = i

forjinrange(i +1, n -1):

第五行接下来我们就要开始循环剩余遍历队列,即从 i + 1 开始,直至数据末尾。来验证当前的最小下标所代表的数据是否真的是所有数据中最小的元素。

defselection_sort(list):

n = len(list)

foriinrange(, n-1):

min_index = i

forjinrange(i +1, n -1):

iflist[min_index] > list[j]

第六行如果当前最小下标所指的元素,即 list[min_indext],大于 list[j]。那么说明最小元素并不是当前的值,我们就需要交换,进行下一步操作。

defselection_sort(list):

n= len(list)

foriinrange(, n-1):

min_indext=i

forjinrange(i +1, n -1):

iflist[min_index] > list[j]

min_index= j

第七行在上一步的 if 判断中,我们已经得出最小下标并不是当前所指的下标,所以我们要及时更改新的下标。

defselection_sort(list):

n= len(list)

foriinrange(, n-1):

min_indext=i

forjinrange(i +1, n -1):

iflist[min_index] > list[j]

min_index= j

ifi != min_index

第八行这句是为了容错处理,因为循环一开始就假设把最小值的下标 i 赋值给变量 min_index。

def selection_sort(list):

n = len(list)

fori in range(, n-1):

min_indext = i

forj in range(i +1, n -1):

iflist[min_index] >list[j]

min_index = j

ifi != min_index

list[min_index],list[i] =list[i],list[min_index]

最后一行代码就是为了把原本的值进行替换。循环遍历,直至结束。

PS:如果这期的文章大家觉得不错,可以随手点赞或者转发到朋友圈。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180419A076SI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券