排序算法之简单选择排序
1.1简单选择排序
属于选择排序 两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是 某一端 结果分为升序和降序排列
1.2降序
n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将 大数和索引0数交换,如果大数就是索引1,不交换。第二轮,从1开始比较,找到最大值,将它 和索引1位置交换,如果它就在索引1位置则不交换。依次类推,每次左边都会固定下一个大数。
1.3升序
和降序相反
1.4区别于冒泡排序
冒泡排序,俩俩比较交换位置 选择排序,每次循环找出极值,在交换索引 减少了交换次数,提高了效率,性能略好于冒泡法
1.5利用python实现降序排序
m_list = [1,9,8,5,6,7,4,3,2] length = len(m_list) for i in range(length): #假定索引0的位置是最大值 maxindex = i for j in range(i+1,length): #在第一次遍历极值的时候发现有比0索引还大的值,把此时的索引值赋值给maxindex if m_list[maxindex]<m_list[j]: maxindex = j #当所有的值都是按降序排序的时候,不用进行交换,否则进行一下操作 if i != maxindex: tmp = m_list[i] m_list[i] = m_list[maxindex] m_list[maxindex] = tmp print(m_list)
1.5.2优化实现;同时固定左边的最大值和右边的最小值;优点减少迭代次数
#二元简单选择排序 lst = [1,9,8,5,6,7,4,3,2] length = len(lst) for i in range(length // 2): maxindex = i minindex = -i-1 #遍历最大值,从左开始到最后一个值, #遍历最小值,从右开始到最后一个值 #遍历下个i的时候,索引0和索引-1的值不需要在比较。所以是length-i for j in range(i+1,length-i): if lst[j]>lst[maxindex]: maxindex = j if lst[-j-1]<lst[minindex]: minindex = -j-1 #假设正索引0的位置是最大的,循环后发现不是,做值的交换 if i!=maxindex: lst[i],lst[maxindex] = lst[maxindex],lst[i] #正索引,负索引2种方式去判断,如果i的位置是最小值的索引 #进入到if里,max已经和i交换了位置,所以需要把max的索引赋值给min if i==minindex or i == length + minindex: minindex = maxindex #假设负索引的位置是-1,循环后发现如果不是,做值的交换 if (-i-1)!=minindex: lst[minindex],lst[-i-1]=lst[-i-1],lst[minindex] print(lst)
本文为原创文章,转载请标明出处