排序之选择排序:简单选择+堆排序

一、简单选择排序

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubantu 添加防火墙策略_Ubuntu 14.04 配置iptables防火墙

Ubuntu默认安装是没有开启任何防火墙的&#xff0c;为了服务器的安全&#xff0c;建议大家安装启用防火墙设置&#xff0c;这里推荐使用iptables防火墙.如果MySQL启本地使用,可以不用打开3306端口.# whereis iptables #查看系统是否安装防火墙可以看到:iptables: /sbin/iptable…

VS集成Qt开发入门(简易时间显示)

VS集成Qt开发入门&#xff08;简易时间显示&#xff09;软件开发入门开发环境简单时间显示&#xff08;LcdNumber&#xff09;ui界面设计&#xff08;clock.ui&#xff09;工程文件&#xff08;clock.h&#xff0c;clock.cpp&#xff09;头文件clock.h&#xff1a;源文件clock.…

ps 毛发 边缘_不会抠图怎么办?PS画笔绘制毛发技巧,抠图流程解析

前两期我们讲了一些简单的抠像方法。第一次我们知道了如何在抠像的同时保留人物投影。第二次我们知道了如何利用背景橡皮擦工具进行抠像。以上是一些稍微简单一些的抠图方法&#xff0c;人人都可以轻松办到。今天讲如何利用PS画笔绘制毛发。今天的知识稍微需要点耐心。如何把下…

Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

Tornado 自定义session&#xff0c;与一致性哈希 &#xff0c;基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash import ringcreate_session_id sasd # 随机生成的 session 函数class SessionGen(object):container {}def __init__(self,ha…

基于结构体的二进制文件读写

基于结构体的二进制文件读写项目介绍工程创建结构体的创建写二进制文件结果读二进制文件结果参考文献项目介绍 本次设计是为了提高读写二进制文件的效率&#xff0c;以约定的结构体形式进行读写操作&#xff0c;避免了一个字节一个字节的多次写入读取操作&#xff0c;并且能以…

排序算法-希尔排序

上一篇讲解了简单插入排序算法&#xff0c;以及在其基础上优化的二分插入排序算法&#xff0c;但是每次插入需要按间隔为 1 移动有序区的元素&#xff0c;效率不高&#xff0c;下面我们来介绍一种新的插入排序算法-希尔排序。 算法简介 希尔排序&#xff08;Shell Sort&#xf…

封包时发现的关于QIODevice类write函数的坑

关于QIODevice类write函数的坑问题概述问题部分代码问题解决结论问题概述 这两天在做TCP通信的封包解包协议操作时&#xff0c;不经意间被write函数坑了好久。通过内存复制进行数据封包&#xff0c;在写入socket的时候总是写入一个字节&#xff0c;不能全部写入数据&#xff0…

java c++ python哪个好_程序员学java好还是python语言好 c++又如何

技术程序员学Java、C、Python... 分析对比&#xff0c;到底学什么语言吃香&#xff0c;哪种语言最靠谱&#xff0c;如何学好这些语言呢&#xff1f;几天前&#xff0c;我们在知识上看到这样一个问题&#xff1a;“java&#xff0c;C&#xff0c;Python&#xff0c;走&#xff0…

Qt多文件传输功能实现及方法概述

Qt多文件传输功能实现前言代码实现概述客户端代码实现服务端代码效果展示结论前言 本次设计主要是为了功能上的实现&#xff0c;因此对于ui界面的设计都是怎么简单怎么来的&#xff0c;主要的功能就是实现多个文件的发送与接收&#xff0c;即客户端发送&#xff0c;服务端接收…

jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式.1、架构图2、服务器列表3、搭…

从java到C++入门

C基础知识前言基础前言 当初为了赶一波互联网热潮自学了java&#xff0c;如今因为需要就从java转向C开发&#xff0c;于是就有了java到C入门&#xff0c;每次的学习我都会记录一下C的学习历程。 基础 C对于内存的控制管理比java要有更多要求&#xff0c;因此C对于变量的创建…

wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法

今天WordPress主题站简单介绍一下WordPress系统中用户信息获取方式&#xff0c;今天就讲讲使用接口方式获取WordPress用户信息的方法。接口文件如下&#xff1a;if (POST ! $_SERVER[REQUEST_METHOD]) {header(Allow: POST);header(HTTP/1.1 405 Method Not Allowed);header(Co…

结构体内存拷贝的两种方法

结构体内存拷贝的两种方法前言内容总结前言 最近看一些代码&#xff0c;发现内存拷贝的两种方式&#xff0c;下面我就来介绍一下两种方式。 内容 首先定义一个结构体processorHead.h&#xff1a; #pragma pack(1)typedef struct {short b;int c;long long d; }DATA;#pragma…

大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量两篇

大学物理实验教案长度和质量的测量两篇篇一&#xff1a;大学物理实验教案4--长度测量大学物理实验教案实验目的&#xff1a;1&#xff0e;掌握游标卡尺、螺旋测微计和移测显微镜的测量原理和使用方法。 2&#xff0e;根据仪器的精度和有效数字的定义&#xff0c;正确记录原始数…

Linux命令应用大词典-第25章 备份与还原

25.1 mkisofs:创建ISO9660/Joliet/hfs文件系统转载于:https://www.cnblogs.com/tqtl911/p/8661006.html

C++灵魂->指针

C灵魂->指针地址指针野指针空指针 【内存动态分配】指针变量的运算&#xff08;&#xff0c;-&#xff0c;&#xff0c;--&#xff09;指针与一维数组地址 计算机将内存以单个字节为单位分开&#xff0c;并对每个字节进行唯一性编号&#xff0c;那么这个编号就是地址。 取…

cpython cython_python – 优化Cython中的字符串

我建议你在cpython.array.arrays上进行你的操作.最好的文档是C API和Cython源码,我太懒了链接了.from cpython cimport arraydef cfuncA():cdef str acdef int i,jfor j in range(1000):a .join([chr(i) for i in range(127)])def cfuncB():cdef:str aarray.array[char] arr,t…

团队协作小结

0.前提&#xff1a;协作目标保持一致&#xff0c;目标理解一致。 1.量化工作内容&#xff0c;以工作量算&#xff0c;可以适当结合成员自身特点划分内容。 2.职责明确&#xff0c;工作块必须有一名负责人&#xff0c;不要搞多人化&#xff0c;防止责任推诿。 转载于:https://ww…

TCP解决粘包问题(结构数据封包拆包)

TCP封包拆包前言封包一、包结构二、封包方法拆包总结前言 TCP协议(Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;即TCP采用字节流的方式&#xff0c;以字节为单位传输字节序列。 如果简单的发送长串的数据流&#xf…

mac下nvm_mac中nvm的安装和使用

nvm 是 Mac 下的 node 管理工具&#xff0c;如果是管理 Windows 下的 node&#xff0c;可以使用 nvmw 或 nvm-windows 。一、若电脑中已安装node,需先卸载。参考学习的文档&#xff1a;http://blog.csdn.net/zjuwwj/article/details/72805671npm ls -g --depth0# 查看已经安装在…