“深入理解”—选择排序算法
选择排序算法有两种:直接选择排序和堆排序
1、直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并放在最前/后位置,下一趟从n-1个元素中选出最小/大的元素并放在最前/后位置。以此类推,经过n-1趟完成排序。
示例如下:
//选择排序public static void selectsort(int[] a){int temp;for(int i=0;i<a.length;i++){//内层循环j=i+1,外层循环控制着循环次数。即每趟中a[i]这个值就是本趟的最小值。i位置上是最小值for(int j=i+1;j<a.length;j++) {if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}}}
2、堆排序:
堆排序涉及到完全二叉树的概念。堆是一个完全二叉树,分为大顶堆和小顶堆两种。
大顶堆:每个节点的值都大于或等于其左右孩子节点的值。如图(1)所示:
小顶堆:每个节点的值都小于或等于其左右孩子节点的值。如图(2)所示:
图 (1) 大顶堆 图( 2) 小顶堆
堆排序算法的定义:
堆排序(Heap Sort)就是利用堆(假设为大顶堆)进行排序的方法。其基本思想是:将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 N -1个元素重新构造成一个堆,这样就会得到N个元素中的次小值。如此反复执行,最后将得到一个有序序列。
堆排序完整代码如下:
public class TestHeapSort {public static void main(String[] args){int[] arr={3,1,2,4,7,6,5,9,8,10};HSort(arr);for(int a:arr)System.out.print(a+" ");}// 堆排序//进行堆排序方法 private static void HSort(int[] arr){ //1、构建大顶堆 for(int parent=(arr.length-1)/2;parent>=0;parent--){ MaxHeap(arr,parent,arr.length-1); } for(int t=arr.length-1;t>0;t--){ swap(arr,0,t); //交换数据 MaxHeap(arr, 0, t-1); //根节点从0开始,继续构建大顶堆。 } } //交换数据方法 private static void swap(int[] arr, int i, int t) { int temp=arr[i]; arr[i]=arr[t]; arr[t]=temp; } /* * 构建大顶堆的方法 * s 代表拥有左右孩子节点的节点,即本次要调整位置的节点 * m 代表当前堆的长度 */ private static void MaxHeap(int[] arr, int s, int m) { int temp,j; temp=arr[s]; for(j=2*s+1;j<=m;j=2*j+1){ //j=2*s+1为s节点的左孩子,j+1为s节点的右孩子 //j=2*j+1是要找到j的孩子节点 if(j<m&&arr[j]<arr[j+1]) j++; //将j指向当前左右孩子节点中的较大值 if(temp>arr[j]) break; //如果s节点的值大于其最大的孩子节点值,则,循环结束,本次不做任何改变 arr[s]=arr[j]; //否则将较大的孩子节点的值赋值给父节点 s=j; //将j的值赋值给s,即j成为了下一波的父节点,继续比较 } arr[s]=temp; //循环结束 } }
在第一次构建大顶堆时,我们int parent = (arr.length-1)/2,也就是父节点从arr[4] = 7开始,4、3、2、1 、0都存在孩子节点。
官方一点就是:我们从最下层最右边的非终端节点开始构建,将其与其孩子节点进行比较和若有必要的互换,对于每个非终端节点来说,其实最多进行两次比较和互换操作,因此整个构建堆的时间复杂度为O(N)。
在正式排序时,第i 次取堆顶记录重建堆需要O(logi)的时间,(完全二叉树的某个节点到根节点的距离为logi+1),并且需要取n-1次堆顶记录,因此,重建堆的时间复杂度为O(nlogN)。
故,总体上堆排序的时间复杂度为O(nlogn)。
从代码中可以看出:
排序过程分为两个for循环,第一个循环完成了将一个带排序序列构建成了一个大顶堆。第二个循环完成逐步将每个最大值的根节点与末尾元素交换,并且再次调整其为大顶堆。
“深入理解”—选择排序算法相关推荐
- 选择排序算法实现思想个人理解
一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...
- 选择排序算法(基于Java实现)
title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...
- 选择排序算法,只需这篇文章就够了
一.说在前面 一直想写一些简单易懂的文章,因为平时看的很多的书籍或者文章都是看着很难受的感觉,当然,这并不是说书籍写的不好,只是说对于一些没有太多基础或者基础不是很好的来说,相对来说还是比较难以理解的 ...
- 排序算法系列:选择排序算法
概述 这是一个相对简单的排序算法.为什么这么说呢?因为不需要什么思考,你就可以掌握并使用它. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Q-WHai ...
- 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法
目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...
- python 选择排序算法
一.选择排序(selection sort) 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位 ...
- 动图图解C语言选择排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- JavaScript实现SelectionSort选择排序算法(附完整源码)
JavaScript实现SelectionSort选择排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 SelectionSort.js完整源代码 Compara ...
- C++实现对链表的选择排序算法(附完整源码)
C++实现对链表的选择排序算法 C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) #include < ...
最新文章
- 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap
- sql server insert values 多值 与oracle 的不同
- 020.2.2 runtime类
- C语言工程实践-简单文本编辑器
- 获取两个数的最大值,判断是否相等;
- python简单的购物程序代码-Python实现购物程序思路及代码
- 微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言|极客头条...
- Linux文件的搜寻
- 企业微信开发实战(二、OA审批之获取审批模版详情提交审批申请)
- 精益生产的本质是什么?如何快速学…
- [数论][高精度]Heaven Cow与God Bull
- 利用js快速完成大学生新生安全教育课程
- P1002 过河卒(dp动态规划,洛谷,java)
- 新手如何搭建一个比较简单的网站?完全不会代码的新手小白搭建自己的网站流程分享!
- php弹窗图片代码大全,render函数生成图片弹窗实例(自己项目实际代码)
- 深入解析,python合并多张图片成视频,可用于批量制作短视频
- 2021年全球成人纸尿裤收入大约11560百万美元,预计2028年达到15440百万美元,2022至2028期间,年复合增长率CAGR为 4.2%
- vue.js移动端记账本完成的总结(未完待续,电脑快没电了) 1
- 投资热点转向蓝筹股?简直是胡说八道!
- 推送中的消息和通知的区别