多种排序算法的速度比较

多种排序算法的速度比较

今天写了一个程序来看看多种排序算法的效率问题,

用于比较的排序算法有:
1. 冒泡排序
2. 双向冒泡排序
3. 选择排序
4. 两端选择排序
5. 插入排序
6. 快速排序
7. 希尔排序。

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

这些排序算法都是在网上去找的,可不是我写的,经过简单测试,所以算法运行结果正确。我写了一个小程序,运行后如下:




下面是对这些排序算法的数据总结:

1,对于一个长度为5000的数组排序,冒泡排序最慢,其次是双向冒泡排序,其他的都一般,快速排序最快!

2,对于一个长度为10000的数组排序还是冒泡排序最慢,其次是双向冒泡排序,快速排序的速度已经不是其他排序一个数量级的了!快啊!

3,对于一个长度为15000的数组排序,还是冒泡排序最慢,其次是双向冒泡排序。快速排序还是那么的快啊!

4,对于一个长度为20000的数组排序,冒泡,双向冒泡,双端选择,选择,插入,名列前五慢,快速排序还是不动声色,佩服!!!

5,对于一个长度为30000的数组排序,除了快速排序还是那么快以外其他所以排序算法都很慢了!

快速排序不是一直都是0毫秒,到了300000长的随机数组进行排序,用时才600毫秒左右!
其他的排序根本不知道要排到什么时候!

 

引用通告地址: http://www.ad0.cn/netfetch/trackback.asp?tbID=85

 
### 各种排序算法的时间复杂度和空间复杂度对比 #### 冒泡排序 冒泡排序是一种简单直观的排序方法,其平均时间复杂度为 O(n²),这表明当输入规模增大时效率较低。然而,该算法的空间复杂度仅为 O(1),意味着它几乎不需要额外内存来完成操作,并且是一个稳定的排序过程[^1]。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] ``` #### 插入排序 插入排序同样具有 O(n²) 的平均时间复杂度,在处理大规模数据集时不占优势;不过它的空间开销很小,保持在 O(1),而且此排序方式也是稳定的。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i-1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key ``` #### 快速排序 作为一种分治策略的应用实例,快速排序拥有较好的性能表现——平均情况下能达到 O(n log n) 的时间复杂度,但在最坏情形下会退化到 O(n²)。值得注意的是,尽管大多数时候只需要占用少量栈帧作为辅助存储(即 O(log n)),但在极端条件下可能会达到线性的空间需求。此外,由于涉及元素交换的过程,所以它是不稳定的排序方案之一。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: 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(N * d),其中 N 表示待排序项的数量,d 则代表关键字的最大位数。与此同时,为了支持多趟分配收集的操作模式,通常需要开辟大小约为 N 的临时数组,因此整体上呈现出 O(N) 的空间特性[^2]。 ```python def radix_sort(nums): RADIX = 10 placement = 1 max_digit = max(nums) while placement <= max_digit: buckets = [[] for _ in range(RADIX)] for i in nums: tmp = int((i / placement) % RADIX) buckets[tmp].append(i) a = 0 for b in range(RADIX): buck = buckets[b] for i in buck: nums[a] = i a += 1 placement *= RADIX ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值