选择排序:

简介

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。
● 初始状态:无序区为R[1…n],有序区为空;
● 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
● n-1趟结束,数组有序化了。

算法基本思想

选择排序是每次从未排序数列中找出其中最小的一个元素,放在正确位置上,比如:数列 49, 38, 65, 97, 76, 13, 27, 49, 55, 4

初始时假设 0 号位置上的元素最小

第一趟的时候,从1号元素开始循环,找出数列中最小的数4放在 0 号位置上

第二趟的时候从未排序数列中找出最小数13,放在1号位置上


如此类推,即可排好序

选择排序算法Python开头 选择排序法python详解_选择排序算法Python开头

算法分析

  1. 无论是最坏情况、最佳情况还是平均情况都需要找到最大值(或最小值),因此其比较次数为(n-1)+(n-2)+…+3+2+1=n(n-1)/2;时间复杂度为O(n2)
  2. 适合数据量小或部分数据已经过排序的情况
  3. 选择排序不稳定

代码实现

def selection_sort(arr):
    for i in range(len(arr) - 1):
        min_index = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr


if __name__ == '__main__':
    numbers1 = [6, 8, 5, 2, 14, 4, 1, 7, 4, 1, 0, 3, 6, 9]
    print(selection_sort(numbers1))

补充:
什么是稳定排序:
在待排序的数据中,存在多个相同的数据,经过排序之后,他们的对相对顺序依旧保持不变,实际上就是说array[ i ]=array[ j ], i<j , 就是排序前
array[ i ]在array[ j ]之前,那么经过排序之后array[ i ]依旧在array[ j ]之前,那么这个排序算法稳定,否则,这个排序算法不稳定
由此我们不难分析出选择排序不稳定
比如: 序列 5 8 5 2 9, 这个在执行选择排序的时候,第一遍,肯定会将array[0]=5,交换到2所在的位置,也就是 2 8 5 5 9,那么很显然,之后的排序我们就会发现,array[2]中的5会出现在原先的array[0]之前,所以选择排序不是一个稳定的排序