交换排序图解_图解简单选择排序
简单选择排序
有如下数组,我们需要对它从小到大排序,步骤如下:
在数组中找到最小值,然后与第一个位置交换。
除去第一个位置在数组中继续找最小值,与第二个位置交换,以此类推,直到末尾。
下图展示了整个交换的过程:
选择排序代码:
public static void sort(Comparable[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
// 寻找[i, n)区间里的最小值的索引
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j].compareTo(arr[minIndex]) < 0) {
minIndex = j;
}
}
// 每一轮循环找到最小的元素交换
swap(arr, i, minIndex);
}
}
private static void swap(Object[] arr, int i, int j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
优化
我们通过类似对撞指针的思路,维护两个指针,这两个指针分别指向最大值和最小值。
步骤如下:
我们让left指针指向数组的起始位置(最小值),right指针指向数组的末尾位置(最大值)。
在left < right的前提下,保证left指向的元素 < right指向的元素,不满足则交换。
在每一轮循环(left+1, right)中,遍历所有元素,如果有元素小于最小值,则更新最小值的位置;否则如果有元素大于最大值,则更新最大值的位置。
一轮循环结束,让最小值和left指向的元素交换,让最大值和right指向的元素交换。
让left指针和right指针所构成的区间减小,即left++, right--。
下图展示了整个交换的过程:
优化的选择排序代码:
// 在每一轮中, 可以同时找到当前未处理元素的最大值和最小值
public static void sort(Comparable[] arr) {
int left = 0, right = arr.length - 1;
while (left < right) {
int minIndex = left;
int maxIndex = right;
// 在每一轮查找时, 要保证arr[minIndex] <= arr[maxIndex]
if (arr[minIndex].compareTo(arr[maxIndex]) > 0) {
swap(arr, minIndex, maxIndex);
}
for (int i = left + 1; i < right; i++) {
if (arr[i].compareTo(arr[minIndex]) < 0) {
minIndex = i;
} else if (arr[i].compareTo(arr[maxIndex]) > 0) {
maxIndex = i;
}
}
swap(arr, left, minIndex);
swap(arr, right, maxIndex);
left++;
right--;
}
}
private static void swap(Object[] arr, int i, int j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
交换排序图解_图解简单选择排序相关推荐
- 【一看就懂的图解算法】简单选择排序
简单选择排序 冒泡排序是将最大的元素往后面排,简单选择排序是将小的元素往前面排 算法思想: 1.将第一个元素和其余元素进行对比,如果第一个元素和其他元素相比,第一个元素大,则交换,一轮下来,最小的元素 ...
- python选择排序算法图解_简单选择排序算法(C语言详解版)
该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...
- 排序算法 | 简单选择排序,算法的图解、实现、复杂度和稳定性分析
今天讲解一下简单选择排序的原理以及实现.复杂度和稳定性分析 这个内容很简单,轻松加愉快,很快就过了~ 目录 简单选择排序 1 基本思想 2 动态图解 3 代码 4 复杂度分析 简单选择排序 1 基本思 ...
- 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)
[排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...
- 【数据结构-排序】3.图解选择排序两种实现(简单选择排序/堆排序)
简单选择排序(选择排序) 排序思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 以此类推,直到所有元素 ...
- java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......
先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...
- 查询数据的排序的位置_简单选择排序C++实现
简单选择排序是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,第一次从下标为0的开始,将下标为0的这个数与后面的n-1个进行比较:找出最小或者最大的放在下标为0的这个位置 ...
- java 排序原理_简单选择排序算法原理及java实现(超详细)
简单选择排序的原理 简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换.以 ...
- 简单选择排序_一文带你读懂排序算法(一):冒泡 amp; 快速选择排序 amp; 简单插入排序算法...
点击上方「蓝字」关注我们 排序是确保数据规则有序的有效手段.日常开发里,我们常用到的是"冒泡"."插入排序"."选择排序"三种.大部分情况下 ...
最新文章
- 小米6鲁大师html5评测,一加6T依然是顶级旗舰!鲁大师2018手机性能榜跑分排前三!...
- QoS policy-map class-map
- vue填坑指南之模板的使用
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
- 21.单链表怎么就地逆序?
- XStream xml与javabean之间的互转
- Java一行代码打印当前系统时间
- K8S Learning(10)——Pod配置
- 《springcloud超级入门》微服务的概念和优缺点《一》
- 十二届蓝桥杯C++ 1月 中 高级组试题 第三题 换算
- (29)VHDL实现时钟分频
- [转载]Hadoop 2.X 日志文件和MapReduce的log文件研究心得
- BMFont工具生成自定义字体
- Unity基础知识之协程
- 如何使用NAS才能确保数据100%安全(数据存储解决方案)
- dnf 服务器喇叭怎么制作,DNF服务器喇叭要删除了吗 服务器喇叭删除后怎么聊天...
- latex怎么改字体大小_latex更改字体 latex局部字体大小
- 京东获取商品历史价格信息 API接口
- Python基础:68 个 Python 内置函数详解
- 梯度消失\梯度爆炸(Vanishing/exploding gradients)与解决方案