简单选择排序

有如下数组,我们需要对它从小到大排序,步骤如下:

在数组中找到最小值,然后与第一个位置交换。

除去第一个位置在数组中继续找最小值,与第二个位置交换,以此类推,直到末尾。

下图展示了整个交换的过程:

选择排序代码:

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. 【一看就懂的图解算法】简单选择排序

    简单选择排序 冒泡排序是将最大的元素往后面排,简单选择排序是将小的元素往前面排 算法思想: 1.将第一个元素和其余元素进行对比,如果第一个元素和其他元素相比,第一个元素大,则交换,一轮下来,最小的元素 ...

  2. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

  3. 排序算法 | 简单选择排序,算法的图解、实现、复杂度和稳定性分析

    今天讲解一下简单选择排序的原理以及实现.复杂度和稳定性分析 这个内容很简单,轻松加愉快,很快就过了~ 目录 简单选择排序 1 基本思想 2 动态图解 3 代码 4 复杂度分析 简单选择排序 1 基本思 ...

  4. 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)

    [排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...

  5. 【数据结构-排序】3.图解选择排序两种实现(简单选择排序/堆排序)

    简单选择排序(选择排序) 排序思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 以此类推,直到所有元素 ...

  6. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  7. 查询数据的排序的位置_简单选择排序C++实现

    简单选择排序是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,第一次从下标为0的开始,将下标为0的这个数与后面的n-1个进行比较:找出最小或者最大的放在下标为0的这个位置 ...

  8. java 排序原理_简单选择排序算法原理及java实现(超详细)

    简单选择排序的原理 简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换.以 ...

  9. 简单选择排序_一文带你读懂排序算法(一):冒泡 amp; 快速选择排序 amp; 简单插入排序算法...

    点击上方「蓝字」关注我们 排序是确保数据规则有序的有效手段.日常开发里,我们常用到的是"冒泡"."插入排序"."选择排序"三种.大部分情况下 ...

最新文章

  1. 小米6鲁大师html5评测,一加6T依然是顶级旗舰!鲁大师2018手机性能榜跑分排前三!...
  2. QoS policy-map class-map
  3. vue填坑指南之模板的使用
  4. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
  5. 21.单链表怎么就地逆序?
  6. XStream xml与javabean之间的互转
  7. Java一行代码打印当前系统时间
  8. K8S Learning(10)——Pod配置
  9. 《springcloud超级入门》微服务的概念和优缺点《一》
  10. 十二届蓝桥杯C++ 1月 中 高级组试题 第三题 换算
  11. (29)VHDL实现时钟分频
  12. [转载]Hadoop 2.X 日志文件和MapReduce的log文件研究心得
  13. BMFont工具生成自定义字体
  14. Unity基础知识之协程
  15. 如何使用NAS才能确保数据100%安全(数据存储解决方案)
  16. dnf 服务器喇叭怎么制作,DNF服务器喇叭要删除了吗 服务器喇叭删除后怎么聊天...
  17. latex怎么改字体大小_latex更改字体 latex局部字体大小
  18. 京东获取商品历史价格信息 API接口
  19. Python基础:68 个 Python 内置函数详解
  20. 梯度消失\梯度爆炸(Vanishing/exploding gradients)与解决方案

热门文章

  1. 办公word,ppt,excel问题
  2. 判别模型和生成模型的区别
  3. 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解
  4. LeetCode简单题之截断句子
  5. LeetCode简单题之交替合并字符串
  6. 2D池化IPoolingLayer
  7. FFmpeg扩展开发
  8. YOLOV4各个创新功能模块技术分析(一)
  9. 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
  10. python 把元组转为列表