知识点8:常见的排序算法–选择排序
来源:互联网 发布:淘宝客服为什么工资高 编辑:程序博客网 时间:2024/06/03 04:20
昨天我们已经介绍了快速排序的原理和实现,并且还通过几个循环渐进的假设来脑补了一回选择排序的执行过程。但很遗憾的是因为这几篇博客都没有在我的电脑上写的,用的是新的linux系统,也没有java执行环境和Android开发环境。所以关于Android系列的博客会在周末更新。好了,话不多说,下面继续我们的选择排序算法。
选择排序的原理
选择排序的原理和冒泡排序比较接近,都是每次把最大或最小的值挪到数组的前面。但不同的地方在于,冒泡排序是两个相邻数组之间的转换,而选择排序则是一开始便确定了最小元素的放置位置。什么意思呢?我们一般遍历整个数组,找到其中的最小(或最大)元素,将其置于数组的首尾arr[0],然后从数组的第二位Arr[1]开始继续执行遍历,取值,交换的操作,知道整个流程结束。
选择排序的实现
我们来看一下它的实现方式:
void selectSort(int[] arr){ int min = arr[0]; int index =0; for(int i=0;i<arr.length;i++){ min = arr[i]; index = i; for(j=i+1;j<arr.length;j++){ if(arr[j]<min){ min =arr[j]; index=j; } } int temp = arr[i]; arr[i] = arr[index]; arr[index] =temp; } }
ps:以上代码在c语言环境通过后手动转化为java代码,但处于个人莫名的自信,这段代码应该还是没问题的。。。如果发现执行不了的话记得反馈啊啊啊~
另外,以上代码的目的是为了让你更好地理解排序算法,但实际上,这一步是有很多冗余代码的,所以我们一般在理解之后,都把代码写成这样:
void selectSort(int[] arr){ int min_index =0; for(int i=0;i<arr.length;i++){ min_index = i; for(j=i+1;j<arr.length;j++){ if(arr[j]<arr[min_index]){ arr[min_index]=arr[j]; index=j; } } int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] =temp; } }
如此,便实现了简单的选择排序。那么,还有没有更好的优化方式呢?有的,那就是双向选择排序:
双向选择排序
何为双向选择排序呢?我们假设要使数组从小到大进行排序,那么如果用简单的选择排序,则是每次得到最小值,然后再将其至于数组首位是吧。可是我们能不能一次性取最大值和最小值,分别置于数组的末位和首位,以此减少数组的循环次数呢?答案是可以的,这就是双向选择排序的思路。但是,双向选择排序不像简单排序那样,它对数组元素的关联性要求很高,也就是说当我们需要进行元素置位时,需要考虑多种情况,逻辑上显得复杂,难以理解。因此,在这里仅当参考,就不再写成java的格式了。
代码更新:昨晚测试双向选择时发现有的地方存在bug,目前已经重新调整,如果有用例测试不通过的,麻烦反馈一下哈!~
void selectSort(int arr[],int num){ int minindex =0; int maxindex = 0; int i,j; int size=num; int temp; for(j=0;j<size;j++){ minindex = j; maxindex = j; for(i=j;i<=size-1;i++){ if(arr[i]<=arr[minindex]){ minindex=i; continue; } if(arr[i]>=arr[maxindex]){ maxindex = i; } } if(minindex != maxindex){ if( maxindex==j && maxindex+minindex == num-1){ temp = arr[minindex]; arr[minindex]=arr[maxindex]; arr[maxindex]=temp; }else if(minindex - maxindex ==1 && maxindex==j &&minindex==size){ temp = arr[minindex]; arr[minindex]=arr[maxindex]; arr[maxindex]=temp; }else if(maxindex==j){ temp = arr[maxindex]; arr[maxindex] = arr[size-1]; arr[size-1] = temp; temp = arr[minindex]; arr[minindex] = arr[j]; arr[j] = temp; }else if(minindex==size){ temp = arr[minindex]; arr[minindex] = arr[j]; arr[j] = temp; temp = arr[maxindex]; arr[maxindex] = arr[size]; arr[size] = temp; }else{ temp = arr[minindex]; arr[minindex] = arr[j]; arr[j] = temp; temp = arr[maxindex]; arr[maxindex] = arr[size-1]; arr[size-1] = temp; } } size--; }
以上就是双向选择排序的算法实现,当然还有优化的地方,比如将元素交换封装成方法,添加其他的边界检测条件等。此处不一一赘述,只是把实现思路厘清。
以便有更好的理解。
下一章:知识点9:常见的排序算法–插入排序,敬请期待~
- 知识点8:常见的排序算法–选择排序
- 知识点9:常见的排序算法–插入排序
- 知识点10:常见的排序算法–希尔排序
- 知识点11:常见的排序算法–归并排序
- 常见排序算法:选择排序
- 面试知识点--常见的8种排序算法
- 知识点6:常见的排序算法---冒泡排序
- 知识点7:常见的排序算法--快速排序
- 常见排序算法(选择排序-曾经的笔记)
- 几种常见的排序算法---选择排序
- 常见的排序算法(二) 选择排序
- 常见排序算法 (三)-选择排序
- 常见排序算法之直接选择排序
- 常见排序算法之选择排序
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- OC学习之道:数据结构中几种常见的排序算法:选择排序,插入排序.快速排序
- 常见的排序算法示例(2)-选择排序、插入排序、希尔排序
- 黑马程序员 知识点总结-Java中几种常见的排序算法
- 关于保险丝
- radioButton图片大小的设置
- Flume 安装
- 安装CocoaPods问题总结
- Linux 跳板机脚本
- 知识点8:常见的排序算法–选择排序
- This application failed to start because it could not find or load the Qt platform plugin "xcb"
- 特性是什么东东?
- ARM 命名规则、架构
- 8 个实用的 Linux netcat 命令示例
- ubuntu16.04安装后要做的事儿~
- 初探谷歌AMP技术
- 网络神器 Netcat
- shell脚本监控登录用户是否异常