图解选择排序算法及优化
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
文章目录
1. 算法思想
2. 算法图解
3. 代码实现
4. 选择排序算法的优化
5. 选择排序特点
1. 算法思想
1. 找到数组中最大(小)的那个元素
2. 将它和数组的第一个元素交换位置(如果第一个元素就是最大或者最小的元素,那么就和自己交换位置)
3. 在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置,一直循环,直到整个数组有序
该算法是在不断地选择剩余元素之中最大(小)的元素然后进行排序,因此该算法叫做选择排序
2. 算法图解
以数组array图解选择排序,排序结果为升序
int[] array = {25,33,10,15,70,45};
假设每个循环开始第一个数是总是最小,minIndex保存最小数的下标i,i范围:从0开始到array.length-1
开始遍历数组,找到最小的数,将索引保存并且交换最小数和当前minIndex所指向的数
假设最小数是33,开始向后遍历,找到最小数15,交换
继续循环,25当前是最小,自己和自己交换
继续循环,33当前是最小,自己和自己交换
继续循环,最小数是45,和70交换
继续循环,70当前是最小,自己和自己交换
至此排序完成
3. 代码实现
import java.util.Arrays;public class ChoiceSort{public int[] sortArray(int[] nums){if(nums.length == 0){return nums;}for (int i = 0; i < nums.length; i++) {int minIndex = i;//最小数的下标,每个循环开始总是假设第一个数是最小数for (int j = i; j < nums.length; j++) {if (nums[j] < nums[minIndex]){//找到最小数minIndex = j;//保存最小数索引}}System.out.println("本轮最小数:"+nums[minIndex]);//交换最小数和当前i所指向的元素int tmp = nums[minIndex];nums[minIndex] = nums[i];nums[i] = tmp;PrintArray.print(nums);System.out.println("————————————————");}return nums;}public static void main(String[] args) {int[] array = {25,33,10,15,70,45};System.out.println("初始数组:");PrintArray.print(array);ChoiceSort choiceSort = new ChoiceSort();choiceSort.sortArray(array);System.out.println("排序完成");PrintArray.print(array);}
}
class PrintArray{public static void print(int[] array){System.out.println(Arrays.toString(array));}
}
结果:
4. 选择排序算法的优化
思路:一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半
遍历数组找到最大值和最小值 , 将最小值放到数组left处,将最大值放到数组right处,然后继续重复操作,直至排序完成
代码:
import java.util.Arrays;public class ChoiceSort{public int[] sortArray(int[] nums) {if (nums.length == 0) {return nums;}/*初始化左端、右端元素索引*/int left = 0;int right = nums.length - 1;while (left < right) {/*初始化最小值、最大值元素的索引*/int min = left;int max = right;for (int i = left; i <= right; i++) {/*标记每趟比较中最大值和最小值的元素对应的索引min、max*/if (nums[i] < nums[min])min = i;if (nums[i] > nums[max])max = i;}/*最大值放在最右端*/int temp = nums[max];nums[max] = nums[right];nums[right] = temp;/*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/if (min == right)min = max;/*最小值放在最左端*/temp = nums[min];nums[min] = nums[left];nums[left] = temp;/*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/left++;right--;}return nums;}public static void main(String[] args) {int[] array = {25,33,10,15,70,45};System.out.println("初始数组:");PrintArray.print(array);ChoiceSort choiceSort = new ChoiceSort();choiceSort.sortArray(array);System.out.println("排序完成");PrintArray.print(array);}
}
class PrintArray{public static void print(int[] array){System.out.println(Arrays.toString(array));}
}
结果:
5. 选择排序特点
待排序序列中,元素个数较少时,适合选用选择排序,时间复杂度为O(n2)
在选择排序中,每趟都会选出最大元素与最小元素,然后与两端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!
图解选择排序算法及优化相关推荐
- 一文搞定选择排序算法
一.选择排序 本次内容概要: 1.选择排序原理 选择排序是一种比较简单而且直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小或者最大的元素,存放在序列的起始位置,直到全部待排序的数据元素 ...
- 动图图解C语言选择排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- python选择排序算法图解_简单选择排序算法(C语言详解版)
该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...
- 排序算法系列:选择排序算法
概述 这是一个相对简单的排序算法.为什么这么说呢?因为不需要什么思考,你就可以掌握并使用它. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Q-WHai ...
- 选择排序法python详解-Python选择排序算法(三)
优化选择排序算法,大致思路是每次循环分别找到最大值和最小值,放到列表的头部和尾部 代码如下: #! coding:utf8 import random def select_sort(arr): fo ...
- Java | 用Java实现选择排序算法(记录写程序全过程的编程哲学)
最近听了马士兵老师的java算法课,感觉这不错,我很欣赏其中的编程哲学. 一.编程哲学 有简单到复杂 1.1 验证一步走一步 1.2 多打印中间结果 先局部后整体 先粗糙后精细 3.1 变量更名 3. ...
- 交换排序图解_排序算法(一):初级比较排序
排序算法,作为算法中最基础的一部分.其中很多思想值得我们学习借鉴,故有必要了解.掌握一些常见常用的排序算法.排序算法根据是否使用比较元素的思想,可分为两大类:比较排序.非比较排序.本文,我们将对比较排 ...
- 算法基础-十大排序算法及其优化(文末有抽奖福利哦)
算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...
- 选择排序算法实现思想个人理解
一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...
最新文章
- Android数据存储——2.文件存储_B_资源文件
- 如何解一元一次方程视频_七年级数学教学视频-小邵课堂
- oracle exp cluster n,oracle cluster verfication utility failed
- android wifi工作流程
- [Java基础]LinkedList集合的特有功能
- php求数组交集的自定义函数,php数组交集函数
- 微信小程序 点击按钮 退出
- 浅谈三层架构 通过这个,+Java开发模式经验。终于相通了,动软到底是为什么这么做...
- git 常用命令及虚拟机服务器仓库搭建
- Latex:TexStudio的使用
- 15. JavaScript Array(数组)对象
- linux命令检索字符串,用Linux的grep命令查找文件中符合条件的字符串
- iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)
- 1074: 百钱买百鸡
- 视频后期调色,PR调色分享,lumetri color调色
- EOF和feof()区别
- Mac的常用快捷键(包括数学字符)
- 汉家江湖永动机统计测试
- XSKY 文件存储首次进入 IDC 榜单
- 一张画布重塑你的职业生涯