桶排序

八大排序算法

妖精的绣舞 提交于 2019-12-07 22:03:57
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 本文将依次介绍上述八大排序算法。 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法步骤 : 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; } } 算法二:希尔排序 希尔排序示意图 希尔排序 ,也称

数据结构与算法之美学习笔记:第十三讲

大城市里の小女人 提交于 2019-12-05 00:24:45
一、课前问题 上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序。 因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法, 都不涉及元素之间的比较操作。 这几种排序算法理解起来都不难,时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很苛刻,所以我们今天 学习重点的是掌握这些排序算法的适用场景 。 按照惯例,我先给你出一道思考题: 如何根据年龄给100万用户排序? 你可能会说,我用上一节课讲的归并、快排就可以搞定啊!是的,它们也可以完成功能,但是时间复杂度最低也是O(nlogn)。有没有更快的排序方法呢?让我们一起进入今天的内容! 二、桶排序(Bucket sort) 1、桶排序的核心思想 首先,我们来看桶排序。桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到一个有序的桶里,每个桶里的数据 再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序的时间复杂度为什么是O(n)呢?我们一块儿来分析一下。 如果要排序的数据有n个,我们把它们均匀地划分到m个桶内,每个桶里就有k=n/m个元素。

排序算法四(桶排序)

好久不见. 提交于 2019-12-04 22:01:08
一、桶排序算法的引入。   之前我们已经说过了计数排序的算法。   这个时候我们如果有这样的一个待排序数据序列: int x[14]={-10, 2, 3, 7, 20, 23, 25, 40, 41, 43,60, 80, 90, 100};   我们如果按照计数排序的算法,那么待排序数据的范围是:-10 到 100   我们为了实现对于这个数据集的遍历,这个时候需要额外的开辟一个大小为(100- (-10)+ 1)的空间,这个时候的空间复杂度达远远超过我们的预计,也就是这个造成了空间的浪费。   所以我们可以说, 计数排序还存在一个缺点:即数据里面的max 和min 的差值相比于待排序数据的数目来说,不能过大,否则会造成空间的浪费   桶排序算法相当于做了一个对于计数排序算法做了一个升级。    只不过计数排序算法计数是对于每一个排序数字进行的,而桶排序算法则将这个范围放宽,变成了一个范围。 二、桶排序算法的过程。   1、比如对于上面的一个待排序数据,我们需要把它划分为一系列的范围,从min 到 min,这就相当于有了一个一个的“桶”。   2、对应的范围的数据放入对应范围的桶里面。   3、然后对于每一个范围的数据采用其他的排序算法进行排序,使得每一个桶内部的数据都是有序的,移动到已经有序的数据集中。   上面有两个步骤比较关键:   第一个是对于桶的范围的划分

【转载】常见十大经典排序算法及C语言实现【附动图图解】

白昼怎懂夜的黑 提交于 2019-12-04 18:22:48
原文链接: https://www.cnblogs.com/onepixel/p/7674659.html 注意 : 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描述信息,后面会持续更新本文。 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 0.4 在线学习 这里提供两个算法可视化网站,方便理解这些排序算法: https://visualgo.net/en/sorting https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

《啊哈算法》读后总结(上)

心已入冬 提交于 2019-12-04 16:05:26
阅读时间 :2019.10.31-2019.11.11 阅读心得 : 这本书早有耳闻,但是一直没有落实去看,最近在给自己充电,于是把这本书看了一遍。总体来说,这本书写得很生动有趣,比较适合零基础的人入门,对于我来说内容有些简单(因为我本科已经接触过一些算法,里面的有些内容我之前已经掌握)。但是,这本书除了算法之外,带给我最大的帮助就是更加熟悉了一点C,因为我的C语言不太好,一直都是学习java,比较逃避C,但是在学习这本书的时候,我把里面出现的所有代码都自己消化并手写了一遍,虽然里面的代码十分浅显,但是一本书写下来,我已经对C没有那么恐惧了。所以,我从心里很喜欢这本书。希望想要入门的小伙伴也能把这本书好好看一看。 阅读总结 : 【这本书一共有九章,第九章是一个思路引领,前八章是妥妥的干货。在这里我对这本书的内容,结合自己的理解做一些记录,方便日后能够复习】 第一章:排序 (有多重要大家心里都知道,不会排序的人生是不完整的人生~) 1.桶排序 说实话,我是在这本书里第一次接触桶排序,之前学的排序算法上来都是直接选择、插入、快速、合并,看了这本书才知道还有桶排序这个神奇宝贝哈哈哈。桶排序堪称最快最简单的排序,它的原理是定义一个数组book[]来标记数字是否出现。比如我们现在要对从1到99之间的若干数字进行排序,那么就定义一个数组book[],每出现一个数字 i,就让对应的book[i

java - 数据结构 - 桶排序

ぃ、小莉子 提交于 2019-12-04 09:21:10
桶排序是拿空间换时间,在数量特别大,桶很多的时候速度比快速排序还要快一些。(但是如果数量过百万可能会内存溢出(数组太长)) 设置10个数组(代表0-9号桶) 先按从个位一次放入对应桶中,然后依次取出放回数组。 然后按十位。。。 百位。。。 。。。 直到最高位都为0. 123,125,214,243,222 第一次(个位): 2: 222 3:123,243 4:214 5:125 然后取出: 222,123,243,214,125 第二次(10位) 1:214 2:222,123,125 4:243 然后取出:214,222,123,125,243 第3次(100位) 1:123,125 2:214,222,243 然后取出:123,125,214,222,243 没有1000位,所以排序结束 其实本质就是按位比较。 //桶排序 public void bucketSort(int[] a) { //先要得到最大的位数,判断循环多少次 int max = a[0]; for (int i = 0; i < a.length; i++) { if (max < a[i]) { max = a[i]; } } //此时max就是最大值 int maxlength = ("" + max).length(); //先把max变成字符串然后取长度,得到位数 int n = 1; //被除数

被搜索引擎坑惨的C++桶排序

匿名 (未验证) 提交于 2019-12-03 00:22:01
桶排序 这个算法时,瞬间就被它可爱的名字给Q到,正好我看的一本C++书上有道桶排序的题目,费了一番功夫后解决了这道题,于是,就去百度,想看看大神们的 桶排序 算法是怎样写的,结果……搜索引擎把我坑惨了,如下图: 搜索到的前n条介绍,都很令人失望,我把他们的代码亲自跑了一遍,都是只能对10以内的数据排序???心里一万个mmp,如果真是这样,那还要 桶排序 干嘛? 我并不清楚正宗的 桶排序 到底是什么样子的,但我按照书上的题目,实现了一个功能还算强大的 桶排序 ,由于我将数据储存为 string类型 ,所以可以对很大的数排序,至于这个数到底有多大,那要看 string类型 数据的长度了(我又手贱百度了一下,好像这个数大到形容不出来……)。 书上的原题是这样的 (我感觉这道题已经把 桶排序 介绍的很到位了,比百度上的各种解释都要清楚): 桶排序(bucket sort) 从一个一维的待排序的正整数数组和一个二维整数数组开始,其中,二维数组的行下标是从0到9,列下标时从0到n-1,n时一位数组中待排序值的个数。这个二维数组的每一行都称为一个桶。编写一个函数bucketSort,它采用一个整数数组和该数组的大小作为参数,并执行以下操作: a) 对于一位数组的每一个值,根据值的个位数,将其放到桶数组的各行中。例如,97放在第7行,3放在第3行,100放在第0行。这称为“分布过程”。 b)

排序之桶排序

匿名 (未验证) 提交于 2019-12-02 23:05:13
/** * * @author Mr.Du * * Data:2019-02-27 * * * 桶排序:桶排序中的桶是什么概念呢?每一个桶代表一个区间范围,里面可以承载一个或多个元素。 * 第一步就是创建这些桶,确定每一个桶的区间范围,具体建立多少个桶如何确定它的区间范围,有很多方法 * 我们这里创建的桶数量等于原始数列的元素数量,除了最后一个桶只包含数组最大值,前面各个桶的区间按 * 比例确定,区间跨度 = (最大值 - 最小值)/(桶的数量 - 1). * 第二步:遍历原始数组,把元素对号入座放入各个桶中 * 第三步:每个桶内的元素分别排序 * 第四步:遍历所有的桶,输出所有元素 */ public static double[] bucket_Sort(double[] arr) { double max = arr[0]; double min = arr[0]; //确定最大最小值 for(double i:arr) { if(i<min) min = i; if(i>max) max = i; } //计算桶的数量 double d = max - min; //初始化桶,定义一个LinkList集合表示桶,ArrayList用来接收所有桶 int len = arr.length; ArrayList<LinkedList<Double>> arraylist =

排序算法之桶排序

流过昼夜 提交于 2019-12-02 15:47:09
桶排序的基本思想: 它就是把数组arr[]划分为N个大小相同的子区间(桶),每个子区间各自排序,最后合并。计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。 步骤:   1.找出待排序数组中的最大值max、最小值min;   2.我们使用动态数组arraylist作为桶,桶里放的元素也用arraylist存储。桶的数量为(max-min)/arr.length+1;   3.遍历数组arr,计算每个元素arr[i]放的桶;   4.每个桶各自排序 算法实现: 1 public static void bucketSort(int[] arr){ 2 int max = Integer.MIN_VALUE; 3 int min = Integer.MAX_VALUE; 4 for(int i = 0; i < arr.length; i++){ 5 max = Math.max(max, arr[i]); 6 min = Math.min(min, arr[i]); 7 } 8 //创建桶 9 int bucketNum = (max - min) / arr.length + 1; 10 ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); 11 for(int i =

排序(冒泡、桶排序、快速)(java)

守給你的承諾、 提交于 2019-12-02 02:29:07
每一个项目中基本都会用到排序,如成绩排名等等,可见排序的重要性,每一种排序方法都有自己的特点,在选择用哪一种排序的时候,要根据数据的多少以及效率、资源占用等问题考虑,排序有多种,比如冒泡排序、二分排序、快速排序、桶排序、堆排序等等,在这里主要给大家接受一下冒泡排序与桶排序以及快速排序。 冒泡排序 冒泡排序是比较典型的一个排序,大家在第一次接触排序时一般都是冒泡排序,冒泡排序的思想就是把大数或小数沉下去,从而完成排序。先给大家看一下源码 package sort; public class maopao { public static void main(String[] args) { int []a=new int[10]; //给数组赋值,大家也可以通过Scanner从控制台输入要排序的数字 int m; for(int i=0;i<10;i++) { a[i]=i; } for(int k=0;k<a.length;k++) { //需要给多少个数排序 for(int p=0;p<a.length-1;p++) { //每次需要比较多少次 if(a[k]>=a[p]) { //比较 m=a[k]; a[k]=a[p]; //两个数互相交换 a[p]=m; } } } for (int i:a) { System.out.println(i); //最后遍历数组,完成排序 }