选择排序

1、简单选择排序:

1、给定一个列表
2、将列表赋值给nums
3、取列表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+minindex

1、生成一个列表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、输出打印nums

def 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)
减少了交换次数,提高了效率,性能略好于冒泡法

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

posted @ 2017-10-10 17:24  zzzzz~  阅读(113)  评论(0编辑  收藏  举报