昨天写了5大排序的交换排序,女朋友给我一个大大的赞,今天一天激情满满。下班了,有时间整理一下另外的排序算法,今晚就写写选择排序吧

二.选择排序(直接选择排序+堆排序)

1.直接选择排序

直接选择排序的核心思想是在无序序列中选择最大(小)值,然后和第一个值进行交换

根据比较类Comparator来判断是升序排列还是降序排列
当Comparator中的compare函数是 a > b ? 1 : (a < b ? -1 : 0)时,则是升序排列
compare函数是a > b ? -1 : (a < b ? 1 : 0)时,则是降序排列

直接选择排序的思路:

①整个数组都是无序区域
②从无序区域的最开始元素开始遍历
③找出无序区域最开始元素后的元素中的最小值
④最小值和无序区域最开始元素交换位置
⑤无序区域最开始元素加入到有序区域
⑥重复①~⑤

时间复杂度:O(n^2)

空间复杂度:O(1)

public static <T> void selectSort(T[] t, Comparator<? super T> comparator) {int size = t == null ? 0 : t.length;T temp = null;for(int i = 0; i < size; i++) {int k = i;for(int j = size - 1; j > i; j--) {if(comparator.compare(t[j], t[k]) < 0) k = j;  // 相当于t[k]总是最小值}// 找出最小值后,和序列开始的值进行交换temp = t[i];t[i] = t[k];t[k] = temp;}}

2.堆排序

根据比较类Comparator类判断是升序序列还是降序序列
若Comparator中的compare函数的返回值是 a > b ? 1 : (a < b ? -1 : 0),则是升序序列
若compare函数的返回值是 a > b ? -1 : (a < b ? 1 : 0),则是降序序列

堆排序的思路:

初始时把n个数的序列看成一棵顺序排列的二叉树,取出堆顶元素,然后再重新组成一棵新的二叉树
1.如何将排序序列组成一棵顺序排列的二叉树,即建立初始堆
①n个节点的完全二叉树,则最后一个节点是(int)n/2个节点的子节点
②从(int)n/2个节点为根的子树开始,使子树成为堆
③依次向前对各节点为根的子树进行筛选,使子树成为堆
④直到根节点为止,就建立了初始堆
2.取出堆顶元素后,二叉树结构已经被破坏,如何重新组成一棵新的顺序排列的二叉树
⑤取出堆顶元素,并将堆底元素送入堆顶(取巧了,将最后一个元素和堆顶元素交换)
⑥将根结点与左、右子树中较小元素的进行交换
⑦若与左子树交换:如果左子树堆被破坏,即左子树的根结点不满足堆的性质,则重复方法⑥
⑧若与右子树交换,如果右子树堆被破坏,即右子树的根结点不满足堆的性质。则重复方法⑥
⑨直到叶子节点为止,堆建成

时间复杂度:O(nlog2n)

空间复杂度:O(1)

public static <T> void heapSort(T[] t, Comparator<? super T> comparator) {int size = t == null ? 0 : t.length;/**********建立初始堆*************/// 最后一个有孩子节点的位置 length / 2 - 1for(int i = (size / 2 - 1); i >= 0; i--) {adjustHeap(t, i, size, comparator);}/**********取出堆顶元素,并重新建立堆************/// 从最后一个元素开始对序列进行调整for(int i = size - 1; i > 0; i--) {//交换堆顶元素t[0]和堆中最后一个元素T temp = t[0];t[0] = t[i];t[i] = temp;// 重新调整堆adjustHeap(t, 0, i, comparator);}}
/*** 调整t[position],根据comparator使其成为小(大)顶堆.即将对第position个结点为根的子树筛选* @param t 待调整的堆数组* @param position 待调整的数组元素的位置* @param length 待调整的数组的长度* @param comparator 比较类* @date 2017年3月7日*/private static <T> void adjustHeap(T[] t, int position, int length, Comparator<? super T> comparator) {T temp = t[position];   // 记录d待调整数组元素的值,即根节点的值int child = 2 * position + 1;  // 左孩子的位置while(child < length) {// 找出左孩子和右孩子中的较小(大)值if(child + 1 < length && comparator.compare(t[child + 1], t[child]) > 0) {child++;}// 如果左孩子和右孩子中的较小(大)值比根节点小(大),则进行替换if(comparator.compare(t[child], t[position]) > 0) {t[position] = t[child];   // 将较小(大)值和根节点进行交换position = child;         // 重新设置position ,即待调整的下一个结点的位置child = 2 * position + 1; // 重新设置左孩子的位置} else {break;  // 如果当前待调整结点小(大)于它的左右孩子,则不需要调整,直接退出}t[position] = temp;  // 将孩子节点设置成根节点}}

测试程序

disturbOrder(T[] t)请查看java算法-排序-交换排序

public static void main(String[] args) {Integer[] numbers = new Integer[9999];for(int i = 0; i < numbers.length; i++) {numbers[i] = i;}disturbOrder(numbers);long start2 = System.currentTimeMillis();selectSort(numbers, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return a > b ? 1 : (a < b ? -1 : 0);}});long end2 = System.currentTimeMillis();System.out.println("选择排序耗时:" + (end2 - start2));disturbOrder(numbers);long start3 = System.currentTimeMillis();heapSort(numbers, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return a > b ? 1 : (a < b ? -1 : 0);}});long end3 = System.currentTimeMillis();System.out.println("堆排序耗时:" + (end3 - start3));
}

Java算法-排序-选择排序相关推荐

  1. Java算法之 选择排序

    为什么80%的码农都做不了架构师?>>>    选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如 ...

  2. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  3. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  4. 数据结构与算法之选择排序

    数据结构与算法之选择排序 目录 基本介绍 选择排序思想 代码实现 1. 基本介绍 选择排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,再依次交换位置后达到排序的目的 2. 选择排序思 ...

  5. java数据结构之选择排序

    作为java排序算法中的一种经典的排序算法,选择排序的思想还是比较容易理解的,其主要的排序过程为: 每一趟从待排序记录中选出最小元素,顺序放在已排好序的最后,直到全部记录排序完毕.也就是:每一趟在n+ ...

  6. 用Java玩转选择排序

    选择排序 算法原理 代码实现 选择排序总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.选择排序之所以叫选择排序就是在一次遍历过程中找到最小元素的角标位置,然后把它放 ...

  7. 决胜经典算法之选择排序

    本场Chat是<决胜经典算法>系列的第二场,同样是众多经典算法里较为简单的一个. 本系列将包含如排序.查找.深度优先/广度优先搜索等等经典算法.仅仅排序部分就包含了10种经典的排序算法,适 ...

  8. 【排序算法】选择排序(Selection sort)

    选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...

  9. 数据结构与算法:选择排序

    数据结构与算法:选择排序 雪柯 大工生物信息 提笔为写给奋进之人 已关注 8 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国忠 特别备注:本书非原创,但部分内容自己 ...

  10. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

最新文章

  1. 交换链表的奇数节点和偶数节点
  2. php access control allow origin,js请求跨域问题--Access-Control-Allow-Origin
  3. 想被千年后的人知道吗,快去GitHub上传代码吧!
  4. 把list清空和赋值null对内存释放的区别
  5. while正逆序的测试结果
  6. 原生 CSS “杀死” 预处理器 Sass!
  7. 关于插件toastr的学习
  8. mysql的lpad函数
  9. Mysql 根据经纬度计算距离
  10. 求四边形最大内接矩形,一种不规则多边形的最大内接矩形的快速近似求解方法与流程...
  11. 基于PaddleX的岩石识别
  12. openldap范例数据库mysql_用mysql作openldap的后台数据库
  13. MiniGPT4,开源了
  14. CNN结构演变总结(二)轻量化模型
  15. 学会这5个拍摄技巧,能让你的视频更好看
  16. html钟表代码运行原理,·钟表指针运行方向的基本原理
  17. 阿里P8共勉之-送书帖-听说最近你读过不少书?
  18. 节拍制作鼓机采样器 XLN Audio XO 1.1.3.3 WiN
  19. unity网络实战开发(丛林战争)-前期知识准备(003-开发服务器端的发送数据和接收数据)
  20. 让html成为电脑桌面背景

热门文章

  1. Unity--简单Buff系统
  2. 【Hadoop集群】-集群搭建踩的那些坑之hadoop篇
  3. win10安装hypermesh无法启动_解决win10系统无法安装打印机
  4. c语言变量类型double,C语言double数据类型介绍、示例和应用经验
  5. 图片大小怎么改小?两个超简单的方法教给大家
  6. java计算机毕业设计高校排课管理系统MyBatis+系统+LW文档+源码+调试部署
  7. ISP学习笔记——imatest软件的使用
  8. SVN merge(合并) 时看不到以前的已经合并过的记录的标识
  9. 企业财务制度二--会计科目名称和编号(一)1243 库存商品(转载)
  10. 二叉树前序遍历-迭代