排序算法————简单选择排序

本文详细介绍了简单选择排序的基本过程,包括降序和升序的实现,并提供了实例分析和基础代码实现。通过逐步讲解,阐述了如何找出每一轮的最大值或最小值并进行位置交换,以及如何优化算法来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导文

简单选择排序

  • 属于选择排序
  • 两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指得是某一段
  • 结果分为升序和降序排列
    降序
    n个数从左至有,索引从0开始到n-1,两两依次比较,记录大值索引,次轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引1,不交换,第二轮,从1开始比较,找到最大值,将他和索引1位置交换,如果它就在索引1位置则不交换。依次类推,每次左边都会固定下一个大数
    升序
    升序和降序相反

基本过程实例1

列表实例:
这里写图片描述
重点注意

  • 共计9个数字,跟踪发现共计8趟即可完成排序算法

  • 每次假设最大索引为第i个数,然后依次在剩下的数中获取最大值的索引位置,方便最后假设的最大索引i和真正最大索引进行位置交换

  • 若在后续最大值索引过程中发现假设的i就是最大值索引,则无需进行位置转化

基础代码实现

#!/home/python/.pyenv/versions/3.5.3/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-10
lst = [1,9,8,5,6,7,4,3,2]
for i in range(len(lst)-1):
    maxindex = i
    for j in range(i+1,len(lst)):
        if lst[maxindex] < lst[j]:
            maxindex = j
    if i != maxindex:
        #如果假设索引和最大索引不想等,则进行位置互换;
        #此时maxindex对应的就是最大值,每次循环万j=8;
        #索引和j是毫无关系的,j仅仅是用来剩余数据选极值;
        lst[i],lst[maxindex] = lst[maxindex],lst[i]
print(lst)

基本过程实现2

实现过程
这里写图片描述

重点注意

  • 严格根据实现过程,先将最大索引找出后,直接替换位置,然后在从剩余选项中选出最小值的索引,然后再次交替位置
  • 忌讳先找出最大索引,然后再找出最小索引,然后一次性替换位置,因为这样有可能会有最大索引和最小索引冲突,当然也有解决方案,但是初始实现过程如下
  • 此种方式实现时,因为都在for j in range()中循环,虽然最终可以实现交换,但是中途更新频率太多,时间复杂度过渡复杂,每次j都会有最大值和最小值交换,因此此方案目前来看效率比较低,但也是一种方法。

实现过程

#!/bin/python3
#-*- coding: UTF-8 -*-
lst = [1,9,8,5,6,7,4,3,2]
for i in range(len(lst)//2):
    maxindex = i
    minindex = -(i+1)
    orignmin = -(i+1)
    for j in range(i+1,len(lst)-1):
        if lst[maxindex] < lst[j]:
            maxindex = j
        if i != maxindex:
            lst[i],lst[maxindex] = lst[maxindex],lst[i]
        if lst[minindex] > lst[j]:
            minindex = j
        if orignmin != minindex:
            lst[orignmin],lst[minindex] = lst[minindex],lst[orignmin]
print(lst)

选择优化实现3

实现过程
这里写图片描述
实现注意

  • 要注意当索引等于i时,最大值和最小值已经互换,因此需要对其进行调整,将最大值的索引位置赋值给最小索引

代码实现

#!/bin/python3
#-*- coding: UTF-8 -*-
lst = [1,9,8,5,6,7,4,3,2]
lengh = len(lst)
for i in range(lengh//2):
    maxindex = i
    minindex = -i-1
    originindex = -i-1
    #由于每次计算后,前后位置都已经确定
    for j in range(i+1,lengh-i):
        if lst[maxindex] < lst[j]:
            maxindex = j
        if lst[minindex] > lst[-j-1]:
            minindex = -j-1
    if i != maxindex:
        lst[i],lst[maxindex] = lst[maxindex],lst[i]
        #由于最小索引为负数,因此当i== lengh + minindex就是正数索引i
        #if i == minindex or i == lengh + minindex:
        if i == lengh + minindex:
            minindex = maxindex
    if originindex != minindex:
        lst[originindex],lst[minindex] = lst[minindex],lst[originindex]
print(lst)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值