[算法 java] 选择排序selectSort
来源:互联网 发布:国潮是什么意思 知乎 编辑:程序博客网 时间:2024/05/24 01:41
算法描述
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
例子
以下面5个无序的数据为例:
56 12 80 91 20(文中仅细化了第一趟的选择过程)
第1趟:12 56 80 91 20
第2趟:12 20 80 91 56
第3趟:12 20 56 91 80
第4趟:12 20 56 80 91
算法分析
时间复杂度
选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2。舍去最高项系数,其时间复杂度为 O(N^2)
空间复杂度
O(1) 用于交换和记录索引
稳定性:不稳定(比如序列[5, 5, 3]第一趟就将第一个5与3交换,导致第一个5挪动到第二个5后面
算法实现
算法第四版的类似实现
public static void selectSort4(int[] arr){ for(int i = 0, len = arr.length; i < len; i++){ int minIndex = i; //默认将当前索引设为最小值 for(int j = i + 1; j < len; j++){ if(arr[j] < arr[minIndex]){ minIndex = j; //如果索引后的值比当前索引值小,替换索引 } } //交换最小索引和当前索引i的值 int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } }
仔细思考了一下,上述实现不是最优实现
原因有两点:
当外层循环循环到(len -1)时就不用继续循环了
当当前索引i是最小值是不用交换
所以参考了网上的资料发现自己的思考是对的,改进代码如下:
public static void selectSort(int[] arr){ for(int i = 0, len = arr.length; i < len - 1; i++){//只需要循环到len-1也就是数组的倒数第二个索引 int minIndex = i; for(int j = i + 1; j < len; j++){ if(arr[j] < arr[minIndex]){ minIndex = j; } } if(minIndex != i){//判断如果minIdex 不是当前索引才交换 int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } } }
1 0
- [算法 java] 选择排序selectSort
- 排序算法-SelectSort-选择排序
- Java--选择排序(SelectSort)
- 数据算法之选择排序(selectSort)的Java实现
- 选择排序(Selectsort)之Java实现
- 选择排序(Selectsort)之Java实现
- 选择排序:selectSort
- selectSort - 选择排序
- SelectSort,选择排序
- 选择排序SelectSort
- 选择排序-selectSort
- 选择排序--SelectSort
- 选择排序-selectsort
- 选择排序(SelectSort)
- 选择排序:selectSort
- 选择排序(SelectSort)
- SelectSort 选择排序
- 【排序算法】直接选择排序(SelectSort)与冒泡排序(BubbleSort)
- ccccss但是看东方
- Spring Bean的生命周期(非常详细)
- java创建线程的4种方式
- Ubuntu下搜狗输入法突然无法输入中文解决方案
- 我决定做点什么
- [算法 java] 选择排序selectSort
- 文件压缩与解压
- 稳定排序:归并排序
- Android studio APK打包签名流程
- java中Keytool的使用总结
- mysql 按月,周 查询,mysql日期函数
- 字符串的全排列和组合算法
- Java中使用Jedis操作Redis
- shrio 权限管理filterChainDefinitions过滤器配置