【数据结构与算法】排序优化

冒泡、插入、选择 O(n^2) 基于比较
快排、归并 O(nlogn) 基于比较
计数、基数、桶 O(n) 不基于比较

总结:如何实现一个通用的高性能的排序函数?

一、如何选择合适的排序算法?

1.排序算法一览表

时间复杂度是稳定排序?是原地排序?
冒泡排序 O(n^2)
插入排序 O(n^2)
选择排序 O(n^2)
快速排序 O(nlogn)
归并排序 O(nlogn)
桶排序 O(n)
计数排序 O(n+k),k是数据范围
基数排序 O(dn),d是维度

2.为什选择快速排序?
1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。
2)为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。
3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。

二、如何优化快速排序?

导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。如何优化分区点的选择?有2种常用方法,如下:
1.三数取中法
①从区间的首、中、尾分别取一个数,然后比较大小,取中间值作为分区点。
②如果要排序的数组比较大,那“三数取中”可能就不够用了,可能要“5数取中”或者“10数取中”。
2.随机法:每次从要排序的区间中,随机选择一个元素作为分区点。
3.警惕快排的递归发生堆栈溢出,有2中解决方法,如下:
①限制递归深度,一旦递归超过了设置的阈值就停止递归。
②在堆上模拟实现一个函数调用栈,手动模拟递归压栈、出栈过程,这样就没有系统栈大小的限制。

三、通用排序函数实现技巧

1.数据量不大时,可以采取用时间换空间的思路
2.数据量大时,优化快排分区点的选择
3.防止堆栈溢出,可以选择在堆上手动模拟调用栈解决
4.在排序区间中,当元素个数小于某个常数是,可以考虑使用O(n^2)级别的插入排序
5.用哨兵简化代码,每次排序都减少一次判断,尽可能把性能优化到极致

四、思考

1.Java中的排序函数都是用什么排序算法实现的?有有哪些技巧?
查看了Java的Arrays.sort
回答1:
1.若数组元素个数总数小于47,使用插入排序
2.若数据元素个数总数在47~286之间,使用快速排序。应该是使用的优化版本的三值取中的优化版本。
3.若大于286的个数,使用归并算法排序。
回答2:

  1. 对于基本类型的数组,Java 采用的是双枢轴快速排序(Dual-Pivot Quicksort),这个算法是 Java 7 引入的。在此之前,Java 采用的是普通的快速排序,双枢轴快速排序是对普通快速排序的优化,新算法的实现代码位于类 java.util.DualPivotQuicksort 中。

  2. 对于对象类型,Java 采用的算法是 TimSort,TimSort 算法也是 Java 7 引入的。在此之前,Java 采用的是归并排序。TimSort 算法实际上是对归并排序的一系列优化,TimSort 的实现代码位于类 java.util.TimSort 中。

  3. 在这些排序算法中,如果数组长度比较小,它们还会采用效率更高的插入排序。

笔记整理来源: 王争 数据结构与算法之美

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

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

相关文章

第七章 假设检验(2)

接上文。 正态总体均值、方差的假设检验 单个正态总体均值的假设检验、方差的假设检验;成对数据均值的假设检验、两个正态总体方差比的检验。根据检验统计量的分布分别称为:z检验、t检验、卡方检验、F检验。 分布原假设H0检验统计量备择假设H1拒绝域单正态(σ2已知…

第二十二期:动画讲解TCP,再不懂请来打我

TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 前言 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官…

【数据结构与算法】二分查找

一、什么是二分查找? 二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。 二、时间复杂度分析? 1.时间复杂度 …

第七章 假设检验(3)

关于样本量n的取值 如果希望在控制第I类错误的情况下,同时限制第II类错误的,这个时候就需要考虑样本量。样本量越大,错误概率越低。使用OC曲线。 分布拟合检验 如果不知道总体服从什么类型的分布,就需要根据样本来检验分布的假设…

git 多用户多仓库配置

ssh全称是Secure Shell,即安全Shell,是一种可以进行安全远程登录的协议,在Linux中以OpenSSH为代表,Windows中则有Putty作为实现。ssh的会话建立阶段类似TCP协议的三次握手,里面涉及到利用非对称加密(RSA/DSA)和密码协商…

第二十三期:你用的Windows操作系统是不是盗版?微软知道吗

长期以来,一些小白对于微软操作系统的“正版”“盗版”“原版”的含义不太明确,从根本上说Windows原始版权属于微软,我们没有那个技术去开发盗版操作系统,很多人用的可能是二次修改的版本,而操作系统的激活方式&#x…

[Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

【问题描述】[中等] 【解答思路】 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {return buildTree(head, null);}public TreeNode buildTree(ListNode left, ListNode right) {if (left right) {return null;}ListNode mid …

第四十六期:关于云存储的五大优势

5G时代,越来越多的企业开始选择在云上存储数据,对于IT部门来说,了解云存储的优势是很有必要的。今天给大家介绍云存储的五大优势,以及它们如何帮助用户解决一些常见IT问题。 1、可扩展性 传统存储系统以及横向扩展增加的节点&…

leetcode之回溯backtracing专题5

参考链接 http://blog.csdn.net/zhongkeli/article/details/6966805 https://leetcode.com/problems/permutation-sequence/#/description

第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?

Java架构师,首先要是一个高级java攻城狮,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池…… Java架构师&…

【数据结构与算法】散列表

一、散列表的由来? 1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。 2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列…

第八章方差分析以及线性回归(1)

方差分析 方差分析是由英国统计学家Fisher在20世纪20年代提出的。  方差分析的目的是推断两个或者两个以上的总体均值是否有差异的显著性检验。 单因素方差分析 例子 保险公司为了了解某一险种在4个不同地区索赔额情况是否存在差异。收集了四个地区一年的索赔额记录。这四个…

react树状组件

最近在react项目中需要一个树状组件,但是又不想因为这个去引入一套UI组件,故自己封装了一个基于react的树状组件, 个人认为比较难得部分在于数据的处理,话不多说直接上代码: 下面是tree.js import React, {Component} …

第四十八期:只因写了一段爬虫,公司200多人被抓!

刚从朋友听到这个消息的时候,我有点不太相信,做为一名程序员来讲,谁还没有写过几段爬虫呢?只因写爬虫程序就被端有点夸张了吧。 作者:纯洁的微笑|2019-10-17 09:51 “一个程序员写了个爬虫程序,整个公司20…

[Leetcode][第647题][JAVA][回文子串][动态规划][中心扩展][Manacher 算法]

【问题描述】[中等] 【解答思路】 1. 暴力 首先明确如何判断一个字符串是否为回文字符串。第一个字符与最后一个字符相同,第二个字符与倒数第二个字符相同…关于中心位置轴对称。 本题要求一共有多少个回文子串,那么就需要判断,索引[i, j]的…

66-加一

给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身 例1: 输入: [1,2,3] 输出: […

玩转oracle 11g(52):Oracle导出导入表(.sql、.dmp文件)两种方法

提示:在导入sql和dmp文件之前,先建立用户,指明表空间。其中要注意用户名和表空间最好跟sql文件中的一样。 方法一:.sql文件的导出与导入 导出步骤 使用PL/SQL Developer登录你需要备份的数据库;选择工具->导出用…

第八章方差分析以及线性回归(2)

一元线性回归 变量间的关系 变量与变量之间的关系分为确定性关系和相关性关系。  确定性关系是指当自变量给定一个值的时候,就能计算出应变量的值。例如物体下落高度h与下落时间t的关系:h12gt2。  相关性关系是指变量之间的关系不确定,表…

Creating a Pulsing Circle Animation

Creating a Pulsing Circle Animation 原文 https://www.kirupa.com/animations/creating_pulsing_circle_animation.htm Outside of transitions that animate between states, we dont see a whole lot of actual animation in the many UIs we interact with. We dont have …

第四十九期:化繁为简的五种码农必备工具

如今,开发工具已成为了软件开发过程中必不可少的组成部分。本文将向您介绍当前软件开发市场上颇具影响力的五种化繁为简的码农必备工具。 不知您是否已经发现:那些以任务为中心的软件开发工作,会比独立的研究式开发复杂得多。针对软件产品的开…