计数排序算是一种桶排序么
发布网友
发布时间:2022-04-07 07:03
我来回答
共3个回答
懂视网
时间:2022-04-07 11:24
简单意义上的桶排序:
● 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话。
● 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内。数据一定是在范围N内的。
● 最后,循环桶里的元素,并且输出,进行从大到小或从小到大的排序。
例如:
● 我们的取值范围是10,那么就要定义一个 11长度的数组$arr. 并且让所有的元素值都为0
● 然后,对需要排序的数组进行循环 如5,3,5,2,8.
● 将数据依次对应$arr桶数组内元素,即 如果是5,则使$arr[5]++.
● 这时候 $arr[2]=1 $arr[3]=1 $arr[5]=2 $arr[8]=1
● 然后循环$arr的数组,若$arr[2]=1,则循环输出元素2一次,$arr[5]=2,则循环输出5两次
● 结果输出即为 2 3 5 5 8
● 如果循环数值是从大到小 则会是从大到小的排序
<?php
//设置默认数组,默认值为0;
$arr = array();
for ($i = 0; $i <= 10; $i++) {
$arr[$i] = 0;
}
//设置测试的五个数据
$arr1 = array(5, 3, 5, 2, 8);
//根据数据 对默认数组的对应元素进行+1; J的取值范围不能等于$arr1数组长度
for ($j = 0; $j < count($arr1); $j++) {
//这边给相应的数组值+1
$arr[$arr1[$j]]++;
}
//开始循环输出 默认数组 $arr 里面相应的值
for ($k = 0; $k <= 10; $k++) {
for ($l=1; $l <=$arr[$k]; $l++) {
echo "$k </n>";
}
}
?>
缺点:
● 浪费空间.
● 无法进行浮点数据的排序.
更多编程相关内容,请关注Gxlcms编程入门栏目!
热心网友
时间:2022-04-07 08:32
那是基数排序
热心网友
时间:2022-04-07 09:50
排序算法称为排??序,即,使记录的字符串,根据一个或一些关键字的大小之一,增量或减量排列操作。
?分类
?计算机科学中使用的排序算法通常被归类为:
?的计算复杂性最差的,平均和最佳的性能,基于串行端口(列表),大小(n)。在一般情况下,良好的性能是O(N log n)的,一个坏的行为是Ω(N2)。一种理想的性能是O(n)的。仅使用一个抽象的键的比较操作的排序算法的总平均至少需要Ω(n日志n)。
?使用记忆体(以及其他计算机资源的使用)
?稳定性:稳定的排序算法维护中的记录按照等号键(换句话说,值)的相对顺序。也就是说,一个排序算法是稳定的,也就是说,当有两个相等的键记录的R和S,并出现在原始序列,其中R在S之前,在排序条件串联?也将是在S之前。
?一般的方法:插入,交换,选择,合并等。交换排序冒泡排序冒泡排序和快速排序(快速排序)。选择排序包含振动筛排序和堆排序(堆排序)。
?当相等的元素是无法区分的,例如,如整数,稳定,是不是一个问题。然而,一些假设他们的第一个数字排序。
?(4,1),(3,1),(3,7),(5,6)
在这种情况下,它是能产生两种不同的结果,一个是维持按照等效键的相对顺序,而另外一个是不是:
?(3,1),(3,7),(4,1),(5,6)(维持秩序)
?(3,7),(3,1),(4,1),(5,6)(的顺序被改变)
?不稳定的排序算法可能会改变相对顺序的等效键的记录,但稳定的排序算法是从来没有的情况下。不稳定排序算法,可以将特别是作为稳定剂。的一种方式,这件事情是比较的人工扩张的关键,所以在其他方面相同的密钥为两个对象之间的比较,将在原来的顺序决定将作品,为决胜局。但是,请记住这个顺序通常涉及额外负担的空间。
?对齐算法列表
?在此表中,n是被排序的记录数,并且k是不同的键的数目。
?稳定
?冒泡排序(冒泡排序) - O(N2)
?鸡尾酒排序(鸡尾酒排序,双向冒泡排序) - O(N2)
?插入排序(插入排序) - O(N2)
?桶排序(桶排序) - O(N);需要额外的内存O(K)
?计数排序(计数排序) - O(N + K);需要额外的内存O(N + K)
?合并排序(合并排序) - O(n日志n);需要额外的内存为O(n)
?的地方归并排序 - O(N2)
二叉排序树(二进制树排序) - O(n日志n);?需要额外的内存为O(n)
?鸽巢排序(鸽笼排序) - O(N + K);需要O(K)额外的记忆体
?基数排序(基数排序) - O(N·K),需要额外的内存为O(n)
?侏儒排序 - O(N2)
?图书馆排序 - O(n日志n)的概率很高,(1 +ε)N需要额外的内存
?不稳定
?选择排序选择排序 - O(N2)
?希尔排序(希尔排序) - O(n日志n)如果您使用的是最好的版本
?梳排序 - O(n日志n)
?堆排序(堆排序) - O(n日志n)
?Smoothsort - O(n日志n)
?一般认为,已知最快的排序快速排序(快速排序) - O(log n)的预期时间,O(n2)的最坏的情况下,对于大的随机数串联
?Introsort - O(n日志n)
?耐心排序 - O(n日志n + k)的最外层时,需要额外的O(N + K)空间,还需要找到最长的递增子序列(递增子序列最长的)
?不实用的排序算法
?茂物排序 - O(N×N)的期望的时候,最坏情况下的无限。
?愚蠢的排序 - O(N3);递归需要额外的内存为O(n2)
珠排序 - O(n)或O(√n)的,但需要特殊的硬件吗?
?煎饼排序 - O(N),但需要特殊的硬件
?排序算法
?排序算法,空间要求和时间效率是不一样的。下面列出了一些常见的排序算法。是插入排序,冒泡排序算法被称为一个简单的排序,他们不要求太多的空间,时间效率并不稳定,后面三种排序相对稍高一些简单的排序空间的要求,但时间效率能够稳定在一个较高的水平。基数排序是排序算法的关键字在一个较小的范围内。
?插入排序
?冒泡排序
?选择排序
?快速排序
?堆排序
合并排序?
?基数排序
?希尔排序
?插入排序
?插入排序实现:
首先,创建一个新的空列表,用于保存有序系列的那种(我们称之为“有序列表”)。?
从原始的系列和一个数字,插入有序列表中删除,但仍保持有序状态。
?第二步骤被重复,直到原始数列为空。
?插入排序的平均时间复杂度是二次,效率不高,但它是很容易实现的。它的想法?逐步扩大的结果“,从而使的有序列表的长度逐渐增加,直至其长度等于原来的列表的长度。
?冒泡排序
?实现冒泡排序如下:
?首先到工作列表中的所有数据进行排序。
?从第一个数的倒数第二个数字,其中一个:如果数字是大于一个在他的下一个,下一个交换。
?重复第二步骤,直到它不再能够进行交换。
?冒泡排序,插入排序的平均时间复杂度,也是方形的水平,但它也很容易实现的算法。
?选择排序
?选择排序实现:
建立一个数组的内存?设n是排名数字数组下标从1到n结束。
?I = 1
?从第i个元素的数组,寻找最小的元素的第n个元素。
?先前的步骤找到最小的元素的第i个元素交换。
?如果i = n-1的算法结束,否则返回到步骤3
?选择排序的平均时间复杂度为O(N 2)。
?快速排序
现在,我们要达到有效的排序算法。实践证明,快速排序的所有排序算法是最有效的。它使用的想法?一分而治之:首先要确保的名单,今年上半年小于下半年,上半年和下半年排序的完整列表下令。这是一个国家的最先进的思想,它是有效的。因为在排序算法,该算法有效或不与在一个列表中的数字之间的比较的数量有直接的关系,以及“保证小于后者的部分的前半部分的清单”,使得前半部分的任何一个号码,从此不跟数的比较,后者的一部分,大大减少了不必要的比较数字。查找数据是另一回事。
?堆排序
?堆排序的前算法,它是这样的:
?首先,创建一个新的空表,插入排序相同的作用,“有序列表”。
?系列中的有序列表的末尾将被添加在人数最多的,并删除它从原来的列数。
?第二步骤被重复,直到原始数列为空。
?堆排序的平均时间复杂度nlogn,高效率(因为堆这种数据结构和奇妙的功能,使“人数最多的系列中的”此操作需要O(1)的时间复杂度,维护需要LOGN的时间复杂度),但是,要达到一个相对复杂的(说,这是更难以实现7算法)。
?堆排序插入排序可能看起来很相似,但事实上,他们在本质上是不同的算法。至少,其时间复杂度的大小的命令,二次和的对数的水平。
?的平均时间复杂度
?插入排序O(N2)
?冒泡排序为O(n2)
?选择排序为O(n2)
?快速排序O(n日志n)
??堆排序O(n日志n)的
?归并排序O(n日志n)
?基数排序O(N)
?希尔排序O(n1.25)
?冒泡排序
?654
例如,这一点,我想它从无到有,从小到大,怎么办呢?
?步骤一:6与5的比例,发现是大于它交换。 564
?步骤2:5与4觉得是大于它,则交换比率。 465
?第三步:6与5的比例,比它是交换。 456