一看题目这么长,聪明的你肯定已经猜到了这是个标题党。
据说这个某个公司的招聘题,某个追求时间和空间极限的bt程序员某个时间脑袋灵光一闪,搞出来这些个所谓的nb算法,然后再自豪地把它们呈给那些技术面试官,让他们用这些来测测我们这些普通程序员的脑袋是否灵光。然而,网络的发达或许让他们的这一想法完全落空,本来就是些高中生都能看懂的算法(似乎我没有夸张),加上网络一传播,地球人都知道了。所以到最后,也只能考考那些从未看过类似我这篇Blog的人:)。所以,我自己倒是更愿意把这个归为一道智力测试题。
国外已经有很多专家在质疑智力测试的准确性,在知识能够迅速获取的今天,很多智力题目只要你做过一次,第二次就不再是智力测试,而是记忆力测试了。所以很奇怪为什么现在面试官对智力测试有一种不可思议地喜欢,我们姑且称之为"智力测试喜好症候群"。
好了,言归正传,看过这篇Blog的ggmm以后面试碰上这种题目就不用经过大脑了,可以脱口而出,或者脱笔而出,或者脱X而出了(Coding,那是脱什么来着?)。
//不用temp的整数交换,一点点数学上的trick:)
void NotempSwap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}
关于时间复杂度为O(n)以及空间复杂度为O(1)的整数排序算法,实际上是有前提的,面试官一般会这么问:
给定1000000个数,这些数都在0~65535之间,设计一个算法,将这些数排序?
下面的这个NiuabilitySort()函数,就是号称时间时间复杂度为O(n)、空间复杂度为O(1)的算法思想的一个实现:
//给100000~...000个整数排序,这些整数的大小都位于0~MAX_NUM之间
const int MAX_NUM = 65535;
int base_array[MAX_NUM];
//sort_array为要排序的数组,length为该数组长度
void NiuabilitySort(int* sort_array,int length)
{
for (int i = 0; i {
//先初始化基数组
base_array[i] = 0;
}
for (int i = 0; i< length; i++)
{
base_array[sort_array[i]]++;
}
//更新排序结果到sort_array中
int j = 0;
for (int i = 0; i < MAX_NUM; i++)
{
if (base_array[i] != 0)
{
for (int k = 0; k {
sort_array[j] = i;
j++;
}
}
}
}
这个算法的思想是:在数字范围有限制的情况下,用一个数组(这里是base_array)记录要排序的数组中(sort_array)每个数字出现的次数,然后再扫描一遍base_array数组,按次数去更新sort_array,而更新值就是base_array当前的下标值。
base_array这个空间是常量,所以空间复杂度是O(1)。两次遍历,对sort_array一遍扫描,时间复杂度是O(n),对base_array一遍扫描,时间复杂度是O(1),所以最后的时间复杂度是O(n)。
分享到:
相关推荐
桶式排序法桶式排序法桶式排序法桶式排序法
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。在iOS开发中,桶排序可以被用于优化大规模数据的排序过程...
桶排序(Bucket Sort)是一种分布式排序算法,它将待排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。这个算法通常适用于数据分布均匀的情况,如果数据在一定...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。桶排序算法的时间复杂度在最理想情况下可以达到线性的O(n...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到有限数量的桶里,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。桶排序的时间复杂度分析是理解其效率的关键部分。下面...
桶排序是一种基于分配和收集的排序算法,特别适合于数据分布均匀且数据范围已知的情况。在C++编程中,桶排序能够高效地对一系列元素进行排序。根据提供的文件内容,我们可以总结以下知识点: 1. **桶排序的基本原理...
### 使用Java实现桶排序 #### 知识点概述 桶排序是一种分布式的排序算法,它将数组分到有限数量的“桶”里,然后分别对每个桶进行排序(通常是使用其他排序算法)。最后,将各个桶的数据按顺序合并起来得到最终...
桶排序(Bucket Sort)是一种分布式排序算法,常用于大数据处理和流式计算中。它将待排序的数据分布到多个“桶”中,每个桶再独立地进行排序,最后按照桶的顺序依次取出桶中的元素,形成有序序列。桶排序的核心思想...
【桶排序】是一种排序算法,它的基本思想是将待排序的数据分布到若干个“桶”中,每个桶内部再进行排序,最后按照每个桶内排序好的数据顺序依次合并,从而得到整个序列的有序排列。在C++编程中,桶排序可以用于解决...
希尔排序、归并排序、桶排序、堆排序和快速排序都是经典的计算机算法,主要用于对数据进行排序。在C++编程语言中,这些排序算法的实现是程序员必须掌握的基础技能之一。接下来,我们将深入探讨这些排序算法的工作...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分到几个有序的桶里,每个桶再分别排序,最后按照每个桶内元素的顺序依次取出,组合成整体的有序序列。这种算法适用于数据分布相对均匀的情况。下面...
经典的桶排序算法实现,在vs2008上调试通过。 算法介绍: 假定:输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数基本思想将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n)...
归并排序和希尔排序在稳定性上有优势,而桶排序则对输入数据分布有特定要求。在实际应用中,根据数据特性选择合适的排序算法至关重要。在Java编程中,理解这些排序算法的实现和性能特点,有助于写出高效、适应性强的...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别独立地进行排序,最后再按照每个桶内元素的顺序依次取出,组合成完全排序的序列。这种算法适用于数据在一定范围内...
桶排序 c编程 附加链队列 和顺队列 1)设置10个桶,也即一个有10个元素的队列数组,每个队列的成员有一个整形数组; 2)从键盘输入30个非负整数;3)找出这30个数中大的数,并计算出它的位数; 4)按照桶排序步骤,...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。桶排序算法基于分治策略,其核心思想是将待排序序列均匀...
数组应用之桶排序课件,用于信息学奥赛基础算法上课应用。课件内容讲解了桶排序的基本思想,问题应用,知识扩展及多维桶等。
桶排序(Bucket Sort)是一种分布式的排序算法,它将元素分布到多个“桶”中,然后对每个桶分别进行排序,最后再将所有桶中的元素合并成一个有序序列。桶排序的基本思想是假设输入数据服从均匀分布,通过将数据分到...
基数排序/桶排序 *统计将数组中的数字分配到桶中后,各个桶中的数字个数 *数组中每个数的每一位数根据大小分配到对应大小为0~9的桶 *将各个桶中的数字个数,转化成各个桶中最后一个数字的下标索引
本文将深入探讨在C++中实现的几种主要排序算法,包括归并排序、插入排序、冒泡排序、希尔排序、快速排序以及桶排序,并对它们的原理、优缺点和适用场景进行比较。 首先,让我们逐一了解这些排序算法。 1. **归并...