桶排序

八大排序算法总结

孤街浪徒 提交于 2020-03-26 05:29:24
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 本文将依次介绍上述八大排序算法。 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法步骤 : 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。) 代码实现: void insert_sort(int array[],unsignedint n) { int i,j; int temp; for(i = 1;i < n;i++) { temp = array[i]; for(j = i;j > 0&& array[j - 1] > temp;j--) { array[j]= array[j - 1]; } array[j] = temp; } } 算法二:希尔排序 希尔排序示意图 希尔排序 ,也称

代码题(32)— 排序算法总结

Deadly 提交于 2020-03-26 04:41:17
0、几种排序对比   1. 从平均时间来看,快速排序是效率最高的,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。而后者相比较的结果是,在n较大时归并排序使用时间较少,但使用辅助空间较多。   2. 上面说的简单排序包括除希尔排序之外的所有冒泡排序、插入排序、简单选择排序。其中 直接插入排序最简单,但序列基本有序或者n较小时,直接插入排序是好的方法 ,因此常将它和其他的排序方法,如快速排序、归并排序等结合在一起使用。 一、交换排序 1、冒泡排序   思想 :对待排序元素的关键字从后往前进行多遍扫描,遇到相邻两个关键字次序与排序规则不符时,就将这两个元素进行交换。这样关键字较小的那个元素就像一个泡泡一样,从最后面冒到最前面来。   时间复杂度 :最坏:O(n2); 最好: O(n); 平均: O(n2)   空间复杂度 :O(1)   稳定性 : 稳定 ,相邻的关键字两两比较,如果相等则不交换。所以排序前后的相等数字相对位置不变。 void BubbleSort(vector<int> &a, int num) { bool flag = true; for (int i = 0; i < num ; ++i) { if (!flag)//判断上一次循环有没有交换 break; flag = false; for (int j = num - 1; j > i; --j) {

JavaScript的9大排序算法详解

时间秒杀一切 提交于 2020-03-17 18:14:58
一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 2.算法描述和实现 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 JavaScript代码实现: function insertionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === ‘Array’) { for (var i = 1; i < array.length; i++) { var key = array[i]; var j = i – 1; while (j >= 0 && array[j] > key) { array[j

漫画:什么是桶排序?

非 Y 不嫁゛ 提交于 2020-03-10 00:18:08
————— 第二天 ————— ———————————— 让我们先来回顾一下计数排序: 计数排序需要根据原始数列的取值范围,创建一个统计数组,用来统计原始数列中每一个可能的整数值所出现的次数。 原始数列中的整数值,和统计数组的下标是一一对应的,以数列的最小值作为偏移量。比如原始数列的最小值是90, 那么整数95对应的统计数组下标就是 95-90 = 5。 那么,桶排序当中所谓的“桶”,又是什么概念呢? 每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。桶排序的第一步,就是创建这些桶,确定每一个桶的区间范围: 具体建立多少个桶,如何确定桶的区间范围,有很多不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除了最后一个桶只包含数列最大值,前面各个桶的区间按照比例确定。 区间跨度 = (最大值-最小值)/ (桶的数量 - 1) 第二步,遍历原始数列,把元素对号入座放入各个桶中: 第三步,每个桶内部的元素分别排序(显然,只有第一个桶需要排序): 第四步,遍历所有的桶,输出所有元素: 0.5,0.84,2.18,3.25,4.5 到此为止,排序结束。 public static double[] bucketSort(double[] array){ //1.得到数列的最大值和最小值,并算出差值d double max = array[0]; double min

10G个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可

风格不统一 提交于 2020-03-08 22:21:10
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的 空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 分析: 既然要找中位数,很简单就是排序的想法。那么 基于字节的桶排序 是一个可行的方法 (请见《 桶排序 》): 思想:将整形的每1byte作为一个关键字,也就是说一个整形可以拆成4个keys,而且最高位的keys越大,整数越大。 如果高位keys相同,则比较次高位的keys。整个比较过程类似于字符串的字典序。 第一步: 把10G整数每2G读入一次内存,然后一次遍历这536,870,912个数据。每个数据用位运算">>"取出最高8位(31-24)。 这8bits(0-255)最多表示255个桶,那么可以根据8bit的值来确定丢入第几个桶。 最后把每个桶写入一个磁盘文件中,同时在内存中统计每个桶内数据的数量,自然这个数量只需要255个整形空间即可。 代价:(1) 10G数据依次读入内存的IO代价(这个是无法避免的,CPU不能直接在磁盘上运算)。 (2)在内存中遍历536,870,912个数据,这是一个O(n)的线性时间复杂度。 (3)把255个桶写会到255个磁盘文件空间中,这个代价是额外的,也就是多付出一倍的10G数据转移的时间。 第二步: 根据内存中255个桶内的数量

数据结构-桶排序 计数排序 基数排序

眉间皱痕 提交于 2020-03-03 15:38:23
文章目录 桶排序(Bucket sort) 简介 时间复杂度 使用场景 计数排序(Counting sort) 简介 例子 代码实现 总结 基数排序(Radix sort) 简介 使用场景 代码实现 总结 注:所有的代码在我的 Github 中有均具体C++代码实现。 这里主要讲的是三大 线性排序 :桶排序(Bucket sort)、计数排序(Counting sort)和基数排序(Radix sort)。 所谓线性排序,也就是说时间复杂度为 O(n),而之所以能够做到线性排序,是因为这三个算法是 非基于比较 的排序算法,都不涉及元素之间的比较操作。 桶排序(Bucket sort) 简介 顾名思义,会用到“桶”,核心的思想就是将要排序的数据分到几个有序的桶里面,然后每个桶再进行单独的排序。桶内的数据排序过后,再把每个桶里面的数据依次取出,这样组成的序列就是有序的了。 时间复杂度 如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素。每个桶内部使用快速排序,时间复杂度为 O(k * logk)。m 个桶排序的时间复杂度就是 O(m * k * logk),因为 k=n/m,所以整个桶排序的时间复杂度就是 O(n*log(n/m))。当桶的个数 m 接近数据个数 n 时,log(n/m) 就是一个非常小的常量,这个时候桶排序的时间复杂度接近

十大经典算法排序总结对比

ぐ巨炮叔叔 提交于 2020-02-28 13:31:56
十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n : 数据规模 k :“桶”的个数 In-place : 占用常数内存,不占用额外内存 Out-place : 占用额外内存 稳定性 :排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bubble Sort) 冒泡排序须知: 作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。。。冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。。。 什么时候最快(Best Cases): 当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊。。。。) 什么时候最慢(Worst Cases): 当输入的数据是反序时(写一个for循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗。。。) 冒泡排序动图演示: 冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1])

桶排序

北慕城南 提交于 2020-02-28 00:42:15
一,介绍 ①什么是桶排序? 桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描 桶 来实现排序。 ②桶排序需要的附加条件 数据的范围已知。 比如,输入整数数据 A(1) A(2)......A(n-1) A(n),它们都是由小于M的整数组成,此时,就可以创建 M 个桶进行桶排序了 再比如,固定长度的字母字符串数据: S(1) S(2) .....S(n-1) S(n),任意的字符串S(i),都由26个小写字母组成,在桶排序过程中,就可以创建26个桶来保存这些字符串 二,桶排序的示例 ①将10万个人的年龄进行桶排序 假设有10万个人的年龄数据, 年龄范围默认是0-99 ,如何对这10万个数据进行排序? 如果用快排啊、归并排序啊...这样的排序算法是可以。但是这样的排序问题更适合桶排序。采用桶排序的方法如下: 建立100个桶,这可以用一个 一维数组来表示。a[0...99],依次扫描10万条数据,根据每条数据的值,记录到桶中。比如,第10个人的年龄是18岁,则a[18]++ (这是将出现的频率记录在桶中,是计数,它是将待排序的元素本身进行比较,而不是将“待排序的元素的 组成部分 ”进行比较) 然后,扫描这100个桶,即可得到有序的数组。 如:一个简单的示例: 所有的数据都在0-5范围内: 4,5,2,3,1,4,3,2,1,5,2

347. 前 K 个高频元素(Java)

若如初见. 提交于 2020-02-16 16:59:23
1 题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/top-k-frequent-elements 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2 Java 2.1 方法一(桶排序) 与桶排序不太一样,桶排序是根据元素值排序,方法是以元素值为索引,将元素数量存入桶数组(即桶标号 = 元素值,桶内值 = 元素数量)。一个桶仅有一个桶标号和一个桶内值,桶 = 存整形的数组。 本题是根据元素数量排序,方法是以元素数量为索引,将元素值存入桶数组中(即桶标号 = 元素数量,桶内值 = 元素值)。这就导致某些桶内存在多个值,桶 = 存集合的数组。 class Solution { public List < Integer > topKFrequent ( int [ ] nums , int k ) { // 先将元素对应的数量存入Map中 HashMap < Integer , Integer > elementNum = new HashMap < Integer ,

十大排序算法

a 夏天 提交于 2020-02-13 02:02:07
好好学习算法基础 0、排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度 :运行完一个程序所需内存的大小。 0.3 算法总结 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 0.5 算法分类 0.6 比较和非比较的区别 常见的 快速排序、归并排序、堆排序、冒泡排序 等属于 比较排序 。 在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。 在 冒泡排序 之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在 归并排序、快速排序 之类的排序中,问题规模通过 分治法 消减为logN次,所以时间复杂度平均 O(nlogn) 。 比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说, 比较排序适用于一切需要排序的情况。 计数排序、基数排序