【从0到1学算法】选择排序

又到了算法时间,今天我们来学第二种算法---选择排序。这里有个表格,记录了乐队及其作品的播放次数,如下:

要将它们按播放次数从多到少排序,要怎么做呢?有一种方法是这样子的,遍历列表,找出播放次数最多的乐队,将这个乐队添加到一个新的列表中。

再次这样做,找出第二多的乐队。

循环上述做法,最终便可得到一个有序列表。

上述这种算法便是选择排序法,n次遍历列表选出最大/小进行排序。我们用代码来一遍呗。题目:对一个数组从小大排序

# 找到最小值的索引
def?find_smallest(arr):
? ?smallest_index?=?0
? ?smallest?=?arr[smallest_index]
? ?for?i?in?range(1,?len(arr)):
? ? ? ?if?arr[i]?

还有另一种写法,为了避免内存浪费,我们可以不用新数组,直接在原数组里面进行排序(这种也是比较常见的)
def?quick_sort(arr):
? ?for?i?in?range(len(arr)):???????# 假设i是最小值的索引  ? ? ? ?smallest?=?i
? ? ? ?#?遍历数组,得到真正最小值的索引
? ? ? ?for?j?in?range(i+1,?len(arr)):
? ? ? ? ? ?if?arr[smallest]?>?arr[j]:
? ? ? ? ? ? ? ?smallest?=?j# 当i为最小值索引,便无需移动元素(i前面的已排好序) ? ? ? ?if?i?==?smallest:
? ? ? ? ? ?pass
? ? ? ?# 将最小值与arr[i]互换位置
? ? ? ?# 经过这步后,i及i前面的都是已排好序的
? ? ? ?else:
? ? ? ? ? ?temp?=?arr[i]
? ? ? ? ? ?arr[i] =?arr[smallest]
? ? ? ? ? ?arr[smallest] =?temp
? ?return?arr

选择排序怎么记忆?关键在于选择二字,选择最大/小,然后呢,排序呗,再然后,重复选择+排序就完事。学会了吗?闭着眼睛写写呗~ps:对了,之前忘记说了,代码语言用的是python,比较简单易懂,会任何一门语言的人应该都能看懂。



文章首发于公众号【KEN DO EVERTHING】
本公众号专注于java相关技术,但不限于java、mysql、python、面试技巧、生活感悟等。分享优质博文,技术干货,学习资源等优质内容。
欢迎关注,一起学习,共成长!

原文地址:https://www.cnblogs.com/KEN-DO-EVERTHING/p/12319400.html

时间: 2024-07-28 16:45:11

【从0到1学算法】选择排序的相关文章

从零开始学算法 - 选择排序

题干:n个数字从小到大排列. 算法思路:遍历数字,将最小的数字放到起始位置,依次循环. 基本实现:  思路:用两层循环实现,外层循环控制整体遍历的次数,内层循环控制当次遍历. var array = [65,97,76,13,27,49,58]; for(var i=0;i<array.length;i++){ var min = array[i]; for(var j=i+1;j<array.length;j++){ if(min>array[j]){ var tmp = min; m

经典排序算法 - 选择排序Selection sort

经典排序算法 - 选择排序Selection sort 顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完 再简单点,对着一群数组说,你们谁最小出列,站到最后边 然后继续对剩余的无序数组说,你们谁最小出列,站到最后边 再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大 举例 先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9] 第一趟找到最小数1,放到最前边(与首位数字交换) 交换前

白话排序算法--选择排序

前言: 继续排序方法,紧接早上的插入排序,紧跟其后,现在跟新上选择排序算法 选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 情景描述: 新学期换了新体育老师,面对同样的排队情景,他说道:“我不管之前是怎么教的,之后都按照我的来做,大家自己进行选择排序”. 从第一位同学开始,和第二位同学比较,谁矮了,谁就记着目前自己是最矮的(可以站前面,嘿嘿), 然后再和第三位

算法----选择排序(select sort)

选择排序就是每次将未排序的数组中最小的一个元素找出,将其与数组的第一个元素交换,从而完成数组的排序. 算法实现: void sort::select_sort(int* a,const int n) { for(int i=0 ;i<n; i++) { int min = i; for(int j=i+1; j<n; j++) { if(a[j] < a[min]) min = j; } swap(a,i,min); } } 上述算法可以看出,在选择排序的过程中只交换了N次数组元素.算法

算法-选择排序

选择排序(Selection sort)是一种常见的排序算法,算法实现的逻辑每一次从待排序的数组中选出最小(或最大)的一个元素,存放在序列的第一个位置,然后生鲜的元素中选择第二小(或者第二大)的元素放在第二个位置,以此类推,将整个数组排序成功.对于一个长度为N的数组,选择排序大概需要N^2/2的比较和N次交换,运行的时间和输入无关,一个有序的数组和一个无序的数组最终运行的时间是一样的,数据移动的次数是最少的,交换数组的次数和数组的大小呈线性关系. 关键代码实现如下: -(NSMutableArr

经典排序算法——选择排序

对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] class SelectionSort { public: int* selectionSort(int* A, int n){ // write code here int k=0; for(int i=0;i<n;++i) { k=i; for(int j=i+1;j<n;++j)//找到最小元素 {

排序算法——选择排序(js语言实现)

选择排序:顾名思义选择,选择排序属于O(N^2)的排序算法,意思就是选择数组中的最小的拿出来放在第一位,然后再剩下的数里面,选择最小的,排在第二位,以此类推. 例如:8  3  4  5  6  2  1  7 第一次:寻找数组中最小的数1,然后和8替换,得到 1 3 4 5 6 2 8 7 第二次:因为1的位置已经确定,所以只需要找剩下数组中最小的就行了,2和3互换得到1 2 4 5 6 3 8 7 第三次:1和2的位置已经确定,就看剩下的数中最小的数,3和4互换,结果是1 2 3 5 6 4

Java学习资料-Java常用算法-选择排序算法

ChooseSort源程序public class ChooseSort { private static void ChooseSort (int [] a){  for(int i = 0; i < a.length; i++){   //对数组循环,假设数据排在前面的元素总比后面的小,然后与后面的数据进行比较   int k = i;   for(int j = i+1; j <a.length; j++){//对数据遍历,寻找最小的数据元素的数组下标    if(a[j]<a[k

算法 排序算法--选择排序

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置)3  2  4  1(最初, mi