选择排序算法有两种:直接选择排序和堆排序

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循环,第一个循环完成了将一个带排序序列构建成了一个大顶堆。第二个循环完成逐步将每个最大值的根节点与末尾元素交换,并且再次调整其为大顶堆。

“深入理解”—选择排序算法相关推荐

  1. 选择排序算法实现思想个人理解

    一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...

  2. 选择排序算法(基于Java实现)

    title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...

  3. 选择排序算法,只需这篇文章就够了

    一.说在前面 一直想写一些简单易懂的文章,因为平时看的很多的书籍或者文章都是看着很难受的感觉,当然,这并不是说书籍写的不好,只是说对于一些没有太多基础或者基础不是很好的来说,相对来说还是比较难以理解的 ...

  4. 排序算法系列:选择排序算法

    概述 这是一个相对简单的排序算法.为什么这么说呢?因为不需要什么思考,你就可以掌握并使用它. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Q-WHai ...

  5. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

  6. python 选择排序算法

    一.选择排序(selection sort) 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位 ...

  7. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  8. JavaScript实现SelectionSort选择排序算法(附完整源码)

    JavaScript实现SelectionSort选择排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 SelectionSort.js完整源代码 Compara ...

  9. C++实现对链表的选择排序算法(附完整源码)

    C++实现对链表的选择排序算法 C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) C++实现对链表的选择排序算法完整源码(定义,实现,main函数测试) #include < ...

最新文章

  1. 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap
  2. sql server insert values 多值 与oracle 的不同
  3. 020.2.2 runtime类
  4. C语言工程实践-简单文本编辑器
  5. 获取两个数的最大值,判断是否相等;
  6. python简单的购物程序代码-Python实现购物程序思路及代码
  7. 微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言|极客头条...
  8. Linux文件的搜寻
  9. 企业微信开发实战(二、OA审批之获取审批模版详情提交审批申请)
  10. 精益生产的本质是什么?如何快速学…
  11. [数论][高精度]Heaven Cow与God Bull
  12. 利用js快速完成大学生新生安全教育课程
  13. P1002 过河卒(dp动态规划,洛谷,java)
  14. 新手如何搭建一个比较简单的网站?完全不会代码的新手小白搭建自己的网站流程分享!
  15. php弹窗图片代码大全,render函数生成图片弹窗实例(自己项目实际代码)
  16. 深入解析,python合并多张图片成视频,可用于批量制作短视频
  17. 2021年全球成人纸尿裤收入大约11560百万美元,预计2028年达到15440百万美元,2022至2028期间,年复合增长率CAGR为 4.2%
  18. vue.js移动端记账本完成的总结(未完待续,电脑快没电了) 1
  19. 投资热点转向蓝筹股?简直是胡说八道!
  20. 推送中的消息和通知的区别

热门文章

  1. 组织知识管理与个人知识管理
  2. 最逗人的歇后语~~~
  3. Pandas中loc和iloc函数用法详解(源码+实例)
  4. 当写博客成为一种习惯—CSDN Blog名列百强纪念
  5. “烧烤模式”下 安防设备如何经得住考验?
  6. 在QT中采用多线程下载文件
  7. 搭建velocity开发环境
  8. 22第十一章:【01】进程管理
  9. 量子计算机瞬移人,量子技术将人瞬移到其他星球,这可能吗
  10. 重庆北大青鸟解放碑校区J12班 chickenNice队【游戏账号交易平台】