简单选择排序实战案例

             简单选择排序实战案例

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

一.简单选择排序概述

简单选择排序
  属于选择排序
  两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是某一端
  结果分为升序和降序排列

降序
  n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引1,不交换。第二轮,从1开始比较,找到最大值,将它和索引1位置交换,如果它就在索引1位置则不交换。依次类推,每次左边都会固定下一个大数。

升序
  和降序相反

简单选择排序总结:
  简单选择排序需要数据一轮轮比较,并在每一轮中发现极值
  没有办法知道当前轮是否已经达到排序要求,但是可以知道极值是否在目标索引位置上
  遍历次数1,...,n-1之和n(n-1)/2
  时间复杂度O(n2)
  减少了交换次数,提高了效率,性能略好于冒泡法

 

二.简单排序原理

初始值:[1 9 8 5 6 7 4 3 2]        

第一趟:[9 1 8 5 6 7 4 3 2]    #选择出此轮最大数9,和索引0数交换选择

第二趟:[9 8 1 5 6 7 4 3 2]    #选择出次轮最大数8,和索引1数交换,下面的工作方式以此类推。

第三趟:[9 8 7 5 6 1 4 3 2]

第四趟:[9 8 7 6 5 1 4 3 2]

第五趟:[9 8 7 6 5 1 4 3 2]

第六趟:[9 8 7 6 5 4 1 3 2]

第七趟:[9 8 7 6 5 4 3 1 2]

第八趟:[9 8 7 6 5 4 3 2 1]

 

三.使用Python代码实现简单排序

1>.简单选择排序代码实现 

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 m_list = [
 8     [1,9,8,5,6,7,4,3,2],
 9     [1,2,3,4,5,6,7,8,9],
10     [9,8,7,6,5,4,3,2,1]
11 ]
12 
13 nums = m_list[1]
14 
15 length = len(nums)
16 
17 print(nums)
18 
19 count_swap = 0
20 count_iter = 0
21 
22 for i in range(length):
23     maxindex = i
24     for j in range(i +1,length):
25         count_iter += 1
26         if nums[maxindex] < nums[j]:
27 
28             maxindex = j
29 
30     if i != maxindex:
31          tmp = nums[i]
32          nums[i] = nums[maxindex]
33          nums[maxindex] = tmp
34          count_swap += 1
35 
36 print(nums,count_swap,count_iter)

2>.简单选择排序代码[优化版]

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 m_list = [
 8     [1,9,8,5,6,7,4,3,2],
 9     [1,2,3,4,5,6,7,8,9],
10     [9,8,7,6,5,4,3,2,1]
11 ]
12 
13 nums = m_list[1]
14 
15 length = len(nums)
16 
17 print(nums)
18 
19 count_swap = 0
20 count_iter = 0
21 
22 for i in range(length // 2):
23     maxindex = i
24     minindex = -i - 1
25     minorigin = minindex
26     for j in range(i +1,length - i ):
27         count_iter += 1
28         if nums[maxindex] < nums[j]:
29             maxindex = j
30         if nums[minindex] > nums[-j - 1]:
31             minindex = -j -1
32 
33     if i != maxindex:
34          tmp = nums[i]
35          nums[i] = nums[maxindex]
36          nums[maxindex] = tmp
37          count_swap += 1
38          if i == minindex or i == length + minindex:
39              minindex = maxindex
40 
41     if minorigin != minindex:
42         tmp = nums[minorigin]
43         nums[minorigin] =  nums[minindex]
44         nums[minindex] = tmp
45         count_swap += 1
46 
47 print(nums,count_swap,count_iter)

3>.简单选择排序代码[优化改进版]

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 m_list = [
 8     [1,9,8,5,6,7,4,3,2],
 9     [1,2,3,4,5,6,7,8,9],
10     [9,8,7,6,5,4,3,2,1]
11 ]
12 
13 nums = m_list[1]
14 
15 length = len(nums)
16 
17 print(nums)
18 
19 count_swap = 0
20 count_iter = 0
21 
22 for i in range(length // 2):
23     maxindex = i
24     minindex = -i - 1
25     minorigin = minindex
26     for j in range(i +1,length - i ):
27         count_iter += 1
28         if nums[maxindex] < nums[j]:
29             maxindex = j
30         if nums[minindex] > nums[-j - 1]:
31             minindex = -j -1
32 
33     # print(maxindex,minindex)
34     if nums[maxindex] == nums[minindex]:
35         break
36 
37     if i != maxindex:
38          tmp = nums[i]
39          nums[i] = nums[maxindex]
40          nums[maxindex] = tmp
41          count_swap += 1
42          if i == minindex or i == length + minindex:
43              minindex = maxindex
44 
45     if minorigin != minindex and nums[minorigin] != nums[minindex]:
46         tmp = nums[minorigin]
47         nums[minorigin] = nums[minindex]
48         nums[minorigin] = tmp
49         count_swap += 1
50 
51 print(nums,count_swap,count_iter)

 

转载于:https://www.cnblogs.com/yinzhengjie/p/10958697.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值