一、简单选择排序

1、思想:每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。与冒泡排序相比,移动数据次数少,节省时间 ,性能优于冒泡排序

2、时间复杂度:

最好:O(N2),正序

最坏:O(N2

平均:O(N2

3、辅助空间:O(1)

4、稳定性:不稳定,交换过程中可能打乱顺序

5、适用场合:n小的情况

public static void selectSort(int[] a) {int i,j,min,t;for(j = 0;j < a.length; j++) {min = a[j];//将待排序的第一个元素设置为最小值t = j; //设置要交换的位置!for(i = j+1;i < a.length; i++) {if (min > a[i]) {min = a[i];t = i;}}if (t != j) swap(a,j,t);//若不为当前位置则交换
        }}

二、堆排序

1、思想:堆排序是一种选择排序,整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。选择排序主要是比较的次数多,所以从减少比较次数入手来改进选择排序,堆排序利用了完全二叉树的性质,当前结点i的子节点为(2i,2i+1),例如大根堆,则当前结点一定大于或等于其任何子节点。

2、时间复杂度:初始建堆O(n),交换堆顶和末尾元素并重建(logn)

最好:O(nlogn)

最坏:O(nlogn)

平均:O(nlogn)

3、辅助空间:O(1)

4、稳定性:不稳定

 1 import java.util.Scanner;
 2
 3 public class HeapSort {
 4     //堆下标从1开始
 5     //从当前给定的点s开始往下调整
 6     //大顶堆,得到递增数组
 7     public static void adjustHeap(int[] a,int s,int len ) {
 8         int rc,i;
 9         rc = a[s];
10         for(i = s*2 ; i<= len ; i = i*2 ) {
11             if(i < len && a[i]<a[i+1]) i++;//取s的两个子节点中较大一个
12             if(rc > a[i]) break;//将rc和当前较大的子节点比较,若大,则不需再往下调整
13             a[s] = a[i];//取较大子节点移动到s
14             s = i;//s变为移动后的位置,向下调整
15         }
16         a[s] = rc;//最后将rc放到相应位置
17     }
18
19     public static void heapSort(int[] a) {
20         int i,tmp;
21         for(i = (a.length-1)/2;i > 0; i--)
22             adjustHeap(a, i, a.length-1);
23         for(i = a.length-1; i > 1;i--) {
24             tmp = a[1];
25             a[1] = a[i];
26             a[i] = tmp;
27             adjustHeap(a, 1, i-1);
28             }
29     }
30
31     public static void insertHeap(int[] a,int x) {
32         int c = a.length - 1,temp,f;
33         a[c] = x;
34         temp = a[c];//当前要插入的结点
35         f = c/2;//父节点
36         while(f>=1 && c != 1) {
37             if(temp < a[f]) break;
38             a[c] = a[f];//若当前结点大于父节点,则将父节点往下调整
39             c = f;
40             f = c/2;
41         }
42         a[c] = temp;
43
44     }
45     public static void main(String[] args) {
46         int[] a = new int[10];
47         Scanner cin = new Scanner(System.in);
48         int i=0;
49         while(i<a.length) {
50             a[i] =cin.nextInt();
51             i++;
52         }
53         heapSort(a);
54         //insertHeap(a, 886);
55         for(i = 1;i < a.length;i++) {
56             System.out.print(a[i]+" ");
57         }
58     }
59 }

三、总结

1、堆排序是简单选择排序的一种改进,改进的着眼点是:如何减少关键码的比较次数

2、简单选择排序在一趟排序中仅选出最小关键码,没有把一趟比较结果保存下来,因而记录的比较次数较多。

堆排序在选出最小关键码的同时,也找出较小关键码减少了在后面的选择中的比较次数,从而提高了整个排序的效率。

3、堆排序对原始记录的排列状态并不敏感,相对于快速排序,这是堆排序最大的优点。

转载于:https://www.cnblogs.com/lizijiangmm/p/8649030.html

排序之选择排序:简单选择+堆排序相关推荐

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

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

  2. 选择排序java代码_JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  3. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

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

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

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

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

  6. 排序算法入门之简单选择排序

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在学了冒 ...

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

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

  8. C语言实现各个排序算法(直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序)

    数据结构开发总结报告 --内部排序综合设计程序的编程实现 #include<stdio.h> #define MaxSize 20 #include<windows.h> ty ...

  9. 数据结构-排序(六)简单选择排序

    本文详细介绍了简单选择排序的算法思想.代码实现和算法效率分析,还包括示例和可视化动图,易理解! Let's go!

  10. 数据结构-选择排序(简单选择排序,堆排序)

    目录 1,简单选择排序 1.1,简单选择排序思想 1.2,选择排序的时间复杂度分析 1.3,简单选择排序代码实现 2,堆排序 2.1,什么是堆排序 2.2,堆排序的思想 2.3,堆排序时间复杂度分析 ...

最新文章

  1. 无法挂载 NTFS格式的分区:mount: unknown filesystem type ‘ntfs’
  2. 【正一专栏】梅西大婚——一辈子守候你都是值得的
  3. 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
  4. AJAX使用说明书 基础
  5. 单手撸了个springboot+mybatis+druid 1
  6. Node Introduce
  7. python手机版做小游戏代码大全-20行python代码的入门级小游戏的详解
  8. 服务器远程关机软件,实现远程关机需要哪些步骤?向日葵怎么实现远程关机控制?...
  9. 【JAVA】List常用移除、过滤、去重、flatMap、peek等操作
  10. python基础教程-第1章节 基础知识
  11. 【连载】Java笔记——欲品香醇先度根叶
  12. 推荐系统(八)FNN模型(FM+MLP=FNN)
  13. 2022-2028全球pH控制剂行业调研及趋势分析报告
  14. Appium+python自动化3-启动淘宝app(转)
  15. 拼多多市值再次超越京东:进攻才是最好的防守!
  16. 全新第八代智能英特尔® 酷睿™ 处理器经全面优化
  17. 贪吃蛇炒鸡优化版(原创)
  18. NetworkMiner主机指纹识别原理
  19. Dubbo高频面试题+解析:dockerinstall未找到命令
  20. 树莓派Bullseye版本更新

热门文章

  1. python编程基础题答案_大学moocPython编程基础题目及答案
  2. CORS 请求未能成功_当遇到跨域开发时, 我们如何处理好前后端配置和请求库封装(koa/axios版)...
  3. Rstudio调用plot()函数时,出现错误的处理方法
  4. mysql安装innodb插件
  5. 改善代码可测性的若干技巧
  6. SQLAllocStmt与SQLFreeStmt
  7. 文件查找_tar_ext34_swap
  8. ASP.NET MVC必知必会知识点总结(二)
  9. Selenium Webdriver ie 浏览器
  10. Android上传文件至服务器(转)