笔试之排序算法(二)

排序(二)(升序)

以下都不是基于比较的算法,它们都是线性时间复杂度

桶排序

额外条件:输入数据 Al,A2 ,.. ., AN 必须只由小于M 的正整数组成

算法思想

  • 使用一个大小为 M 称为Count的数组,它被初始化为全0
  • Count有M个元素,即M个桶,且桶初始化为空
  • 当读入Ai时,Count[i]加1
  • 在所有的输入数据读入后,扫描数组Count,打印出排序后的表

性能分析

算法用时O(M+N),即O(N)

计数排序

算法思想

对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放在它在最终输出数组的位置上
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

代码和图示

性能分析

当输入的元素是n个0到k之间的整数时,它的运行时间是 O(n + k)

基数排序

算法思想

将待排数据中的每组关键字依次进行桶分配

基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:
- (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
- (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)

例子和代码

性能分析

基数排序的性能比桶排序要略差。
- 每一次关键字的桶分配都需要O(N)的时间复杂度,而且分配之后得到新的关键字序列又需要O(N)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2N),当然d要远远小于N,因此基本上还是线性级别的。
- 基数排序的空间复杂度为O(N+M),其中M为桶的数量。一般来说N>>M,因此额外空间需要大概N个左右。

特点

为稳定排序算法

参考资料:计数排序、桶排序和基数排序

### 常见笔试算法题中的分法与排序 #### 分法的应用场景 分法是一种高效的搜索方法,在处理有序数据时尤为有效。它主要应用于两种领域:整数域和实数域。 - **整数域上的分** 在整数域上应用分法时,需特别注意边界的设定以及区间的开闭情况,以防止遗漏答案或陷入死循环[^2]。例如,在寻找数组中某个特定值的位置时,可以采用如下代码实现: ```python def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` - **实数域上的分** 对于实数域上的问题,如求平方根或其他数值逼近问题,则需要注意精度控制。通常可以通过设置误差阈值来决定迭代停止条件。下面是一个计算平方根的例子: ```python def sqrt_binary(x, precision=1e-7): low, high = 0, max(1, x) while high - low > precision: mid = (low + high) / 2 if mid * mid > x: high = mid else: low = mid return round((high + low) / 2, int(-np.log10(precision))) ``` #### 排序相关问题 在算法笔试中,除了直接考察各种经典排序算法外,还会结合实际应用场景设计复杂度分析等问题。以下是几个典型例子及其解决思路: - **快速排序** 快速排序利用分治策略将待排序序列划分为较小部分并分别递归处理。其平均时间复杂度为O(nlogn),但在最坏情况下会退化到O()[^1]。具体实现可参阅以下代码片段: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] left = [x for x in arr if x<pivot] middle = [x for x in arr if x==pivot] right = [x for x in arr if x>pivot] return quick_sort(left)+middle+quick_sort(right) ``` - **堆排序** 堆排序基于叉堆结构完成,先构建最大(最小)堆,随后依次取出堆顶元素形成最终有序列表。该方法的时间复杂度稳定为O(nlogn)[^3]。 ```python import heapq def heap_sort(iterable): h = [] result = [] for value in iterable: heapq.heappush(h, value) for i in range(len(h)): result.append(heapq.heappop(h)) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值