排序算法之简单选择排序

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)

 

posted @ 2018-04-02 21:51  亚洲哈登  阅读(337)  评论(0编辑  收藏  举报