选择排序:每次选择一个最小的放入到一个新的数组或者列表中,以此来排序,放入到新数组的元素在原来的数组中要删除。
需要检查的元素数越来越少
随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一
个。既然如此,运行时间怎么还是O(n2)呢?这个问题问得好,这与大O表示法中的常数相关。
第4章将详细解释,这里只简单地说一说。
你说得没错,并非每次都需要检查n个元素。第一次需要检查n个元素,但随后检查的元素
数依次为n 1, n – 2, …, 2和1。平均每次检查的元素数为1/2 × n,因此运行时间为O(n × 1/2 × n)。
但大O表示法省略诸如1/2这样的常数(有关这方面的完整讨论,请参阅第4章),因此简单地写作O(n × n)或O(n2)。
#!/usr/bin/env python # -*- coding: utf-8 -*- '选择排序 ' __author__ = 'chris' ''' 对下列歌手的听歌次数进去排序,使用选择排序 O(n*n) ''' # RADIOHEAD 156 # KISHORE KUMAR 141 # THE BLACK KEYS 35 # NEUTRAL MILK HOTEL 94 # BECK 88 # THE STROKES 61 # WILCO 111 def section_sort(list): newArr = [] for i in range(len(arr)): index = findSmallest(list);# 找到最小元素的下标 newArr.append(arr.pop(index)) # 在新列表中添加最小的元素,并且原列表中删除,pop() 删除元素,并且返回 return newArr def findSmallest(list): for smallValue_ele in list[0].values(): pass smallest_index = 0 for i in range(1,len(list)): for key,value in list[i].items(): if value < smallValue_ele: smallValue_ele = value smallest_index = i; return smallest_index arr = [{'RADIOHEAD':156},{'KISHORE KUMAR':141},{'THE BLACK KEYS' : 35},{'NEUTRAL MILK HOTEL':94},{'BECK':88}, {'THE STROKES':61},{'WILCO':111}] res = section_sort(arr) print(res)