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

嘿嘿,不要怪我啦,别的都看不懂,就从最基本的开始讲解!

选择排序算法思想
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余的未排序的元素中继续寻找最小(大)元素,然后放到已排序的末尾。直到所有元素均排序完毕。
这里写图片描述

代码实现
对于一个无序的序列我们可以通过n-1趟排序得到排序结果。
我们定义一个无序序列list[R0…….RN]
Step1.找出循环次数,列表的长度-1
Step2.将当前的数字下标索引定成目标,与下面的每一个数进行比较
Step3.根据比较的结果决定位置的互换

import random

def selection_sort(list):
    for i in range(0,len(list)-1):#第一趟循环次数
        min = i #设定暂时最小值为无序区间第一个元素
        for j in range(i+1,len(list)):#第二趟排序让min去和无序数列的数作比较找出真正最小值
            if list[min] > list[j]:
                min = j
        list[min],list[i] = list[i],list[min]
    return list
if __name__ == '__main__':
    list = [45,32,67,8,2,43]
    print(selection_sort(list))
    b = [random.randint(1,1000) for i in range(100)]
    print(selection_sort(b))

时间复杂度
选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。
共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得 (N - 1 + 1) N / 2 = N^2 / 2
舍去最高项系数,其时间复杂度为 O(N^2)。
虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。
而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。而且,交换排序比冒泡排序的思想更加直观。


最后感谢,JollyWing的链接:http://www.cnblogs.com/jiqingwu/p/selection_sort_algorithm.html

猜你喜欢

转载自blog.csdn.net/weixin_38725737/article/details/81871588