python选择排序 时间复杂度
Posted 早起的年轻人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python选择排序 时间复杂度相关的知识,希望对你有一定的参考价值。
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
排序算法不稳定的含义是:在排序之前,有两个数相等. 但是在排序结束之后,它们两个有可能改变顺序.
1 前言
给定一个整数序列,按照从小到大的顺序(确切地说,是非递减的顺序)排列序列中的整数
选择排序的思想:选出最小的一个和第一个位置交换,选出其次小的和第二个位置交换 ……
直到从第N个和第N-1个元素中选出最小的放在第N-1个位置。
2 选择排序写法一
def select_sort(li):
li_new = []
for i in range(len(li)):
# 选出数组li中的最小值
min_val = min(li)
print("i %d %d" % (i, min_val))
# 向临时数组中添加最小元素
li_new.append(min_val)
# 移除原数组中的最小元素
li.remove(min_val)
print(li)
return li_new
执行
li = [3, 2, 4, 7, 1, 2]
# 排序前
print(li)
print("-----------")
# 执行排序
netList = select_sort(li)
print("-----------")
# 排序后
print(netList)
3 选择排序写法二
def select_sort2(li):
for i in range(len(li) - 1):
# 记录最小值的角标
min_index = i
for j in range(i + 1, len(li)):
# 如果当前值小于 min_index 角标下的值
if li[j] < li[min_index]:
# 就进行值替换 目的是将最小的值放在最左侧
li[i], li[min_index] = li[min_index], li[i]
print(li)
执行
li = [3, 2, 4, 7, 1, 2]
# 排序前
print(li)
print("-----------")
# 执行排序
select_sort2(li)
print("-----------")
# 排序后
print(li)
执行结果
4 时间复杂度
第一次内循环比较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交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。而且,交换排序比冒泡排序的思想更加直观。
以上是关于python选择排序 时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章
基础篇9 # 排序:冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)