1、简单选择排序:
1、给定一个列表
2、将列表赋值给nums3、取列表nums的长度4、迭代长度5、定义一个maxindex,赋值i 假定i为最大值索引6、迭代i+1-length 如果maxindex[i]的值小于nums[j] 将j赋给maxindex 然后nums[maxindex]就是最大值了7、如果i不等于maxindex 就将nums[maxindex]交换给nums[i]将大值往前面排列def selectsort(lst1): nums = lst1 length = len(nums) print(nums) for i in range(length): maxindex = i for j in range(i+1, length): if nums[j] > nums[maxindex]: maxindex = j if i !=maxindex : nums[i], nums[maxindex] = nums[maxindex], nums[i] print(nums)selectsort([1, 8, 9, 5, 6, 7, 4, 3, 2])
打印结果:
[1, 8, 9, 5, 6, 7, 4, 3, 2]
[9, 8, 7, 6, 5, 4, 3, 2, 1]2、二元选择排序:
二次选择排序,同时固定左边最大值和右边最小值
优点:减少迭代元素的次数1、length//2 ,减少迭代次数2、由于使用了负索引,所以条件要增加 i == length+minindex1、生成一个列表arr,赋值到nums,取nums的长度
2、迭代length//2 一半长度3、定义maxindex 假设最大值 minindex假设最小值 min 为minindex初值4、迭代i+1 - length-i 如果 nums[maxindex]<nums[j] 就把j的值赋给maxindex如果nums[minindex]>num[-j-1] 使用负索引的形式,如果倒数第二位小于minindex 就把它赋值给minindex 使minindex为最小值如果i!=maxindex 交换maxindex和i的值 ; (如果i==num[maxindex] or i == length+minindex,将maxindex赋值给minindex )-->如果最小值是第一位或者最后一位就赋值给minindex length+minindex 负索引的格式5、如果min != minindex 就交换minindex和min的值6、输出打印numsdef tselect_sort(lst1): nums = lst1 length = len(nums) print(nums) for i in range(length//2): maxindex = i minindex = -i -1 minvalue = minindex for j in range(i + 1, length - i): if nums[j] > nums[maxindex]: maxindex = j if nums[-j - 1] < nums[minindex]: minindex = -j - 1 if nums[maxindex] == nums[minindex]: break if i!= maxindex: nums[i], nums[maxindex] = nums[maxindex], nums[i] if i == minindex or i == length + minindex: minindex = maxindex if minvale != minindex: nums[minvalue], nums[minindex] = nums[minindex], nums[minvalue] print(nums)lst1 = [1, 8, 9, 5, 6, 7, 4, 3, 2]tselect_sort(lst1)
打印结果:
[1, 8, 9, 5, 6, 7, 4, 3, 2]
[9, 8, 7, 6, 5, 4, 3, 2, 1]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
总结: 简单选择排序需要数据一轮轮比较,并在每一轮中发现极值 没有办法知道当前轮是否已经达到排序要求,但是可以知道 极值是否在目标索引位置上 遍历次数 1,……,n-1之和 n(n-1)/2 时间复杂度O(n^2) 减少了交换次数,提高了效率,性能略好于冒泡法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~