简单选择排序实战案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.简单选择排序概述
简单选择排序 属于选择排序 两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是某一端 结果分为升序和降序排列 降序 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)