简单排序,以及求最大值,次最大值
Posted 小白社会工程学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单排序,以及求最大值,次最大值相关的知识,希望对你有一定的参考价值。
![](https://image.cha138.com/20211105/998caa19bc3a4a2eba689141f4eae288.jpg)
1 /* 2 对n个记录进行n-1简单选择排序 3 在无序区【i,n-1】选取最小记录,设其下标为index 4 将最小记录与第i个记录进行交换 5 */ 6 7 8 // 简单选择排序算法 9 10 void selectsort(int p[],int n){ 11 for(int i=0;i<n-1;i++){ 12 int temp,index; 13 index=i; 14 for(int j=i+1;j<n;j++){ 15 if(p[index]>p[j]) 16 index=j; 17 } 18 19 if(index!=i){ 20 temp=p[index]; 21 p[index]=p[i]; 22 p[i]=temp; 23 } 24 } 25 }
![](https://image.cha138.com/20211105/998caa19bc3a4a2eba689141f4eae288.jpg)
1 /* 2 1.将前两个元素进行比较,较大者放到max中,较小者放到nmax中 3 4 2.从第3个元素开始直到最后一个元素依次取元素 A[i], 执行下列操作 5 2.1 如果A[i]>max, 则A[i]为最大值,原来的最大值为次最大值 6 2.2 否则,如果A[i]>nmax, 则最大值不变,A[i]为次最小值 7 8 3.输出最大值max,次最大值为inmax 9 */ 10 void max_nextmax(int p[],int &max,int &nmax,int n){ // 11 12 if(p[0]>=p[1]){ //前两个元素进行比较 13 max=p[0]; 14 nmax=p[1]; 15 } 16 else{ 17 max=p[1]; 18 nmax=p[0]; 19 } 20 for(int i=2;i<n;i++){ 21 if(p[i]>=max){ 22 nmax=max; 23 max=p[i]; 24 } 25 else if(p[i]>nmax){ 26 nmax=p[i]; 27 } 28 } 29 }
选择排序
目录
选择排序
标签(空格分隔): python-排序算法
基本算法:一次确定一个最大值,或者最小值
# 简单选择排序 降序排列
lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
length = len(lst) # 计算长度
for i in range(length):
maxindex = i # 降序排列, 每次认为自己为最大值
for j in range(i+1, length):
if lst[j] > lst[maxindex]:
maxindex = j
if i != maxindex: # 当 i != maxindex 是, 再交换,可以减少几次交换
lst[i], lst[maxindex] = lst[maxindex], lst[i]
print("简单选择排序实现: ".format(lst))
二元选择排序
- [x] 优化实现思路
- 同时固定左边最大值, 和右边最小值(降序排列)
- [x] 优点
- 减少元素迭代的次数
- [x] 时间复杂度为:
- O(n*(n/2))
算法优化: 一躺确定一个最大值,一个最小值
# 二元选择排序算法 降序排列
lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
length = len(lst)
for i in range(length//2): # 这里不是 length//2+1的原因是, 如果是奇数,极大值极小值交换就可以了,剩下的一定是中间值,或者,等于极大值或者极小值
maxindex = i
minindex = - i - 1
minorigin = minindex
for j in range(i+1, length-i): # 计算极值
if lst[j] > lst[maxindex]:
maxindex = j
if lst[-j-1] < lst[minindex]:
minindex = -j-1
# 实现交换
if i != maxindex:
lst[maxindex], lst[i] = lst[i], lst[maxindex]
# 如果初始的极大值的位置是极小值, 则极大值交换后, 会影响极小值的位置
if i == minindex or i == length + minindex:
# i == length + minindex 考虑的是 minindex是负索引的情况
minindex = maxindex
if minorigin != minindex:
lst[minorigin], lst[minindex] = lst[minindex], lst[minorigin]
print("二元选择排序实现: ".format(lst))
算法改进: 如果再一轮中确认的最大值和最小值是同一个,则可以结束排序了
- [x] 改进思路
- 1、再二元选择排序中,如果在一轮比较中,极值相等,则可以可以确定排序已经完成,则可以提前跳出循环
- 2、如果最小值和待交换的值相等,则可以不用交换
- [x] 优点
- 减少迭代元素次数
- 减少元素交换次数
# 二元选择排序算法 降序排列
lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
length = len(lst)
for i in range(length//2): # 这里不是 length//2+1的原因是, 如果是奇数,极大值极小值交换就可以了,剩下的一定是中间值,或者,等于极大值或者极小值
maxindex = i
minindex = - i - 1
minorigin = minindex
for j in range(i+1, length-i): # 计算极值
if lst[j] > lst[maxindex]:
maxindex = j
if lst[-j-1] < lst[minindex]:
minindex = -j-1
# 优化点: 如果极大值和极小值相等,则排序已经完成
if lst[minindex] == lst[maxindex]:
break
# 实现交换
if i != maxindex:
lst[maxindex], lst[i] = lst[i], lst[maxindex]
# 如果初始的极大值的位置是极小值, 则极大值交换后, 会影响极小值的位置
if i == minindex or i == length + minindex:
# i == length + minindex 考虑的是 minindex是负索引的情况
minindex = maxindex
if minorigin != minindex and lst[minindex] != lst[minorigin]:
# 优化点:lst[minindex] != lst[maxindex], 如果值已经相同则可以不用交换了
lst[minorigin], lst[minindex] = lst[minindex], lst[minorigin]
print("二元选择排序实现: ".format(lst))
简单选择排序总结
- [x] 简单选择排序需要数据一轮一轮比较,并再每一轮中发现极值
- [x] 没有办法知道当前轮是否已经达到排序要求,但是可以知道极值是否在目标索引位置上
- [x] 遍历次数 1,... n-1 之和, n(n-1)/2
- [x] 时间复杂度为: O(n*n)
简单选择排序和冒泡法的比较
- [x] 减少了交换次数,提高了效率,性能略高于冒泡法
以上是关于简单排序,以及求最大值,次最大值的主要内容,如果未能解决你的问题,请参考以下文章