八中排序方式的对比
数据生成
我采用随机函数来生成随机数据,将生成的数据保存在.txt文件里
生成的数据大小范围在    [ 0 , n ]    \; [0,n]\; [0,n]内,生成的数据完全是随机的
其中 n = 1 0 3 , 1 0 4 , 1 0 5 , 1 0 6 n = 10^3, 10^4,10^5,10^6 n=103,104,105,106
采用当前时间来作为随机数种子
srand(time(NULL));//随机数种子
生成的数据将保存在文件名为以下的文件里
1 e 3. t x t 1e3.txt 1e3.txt
1 e 4. t x t 1e4.txt 1e4.txt
1 e 5. t x t 1e5.txt 1e5.txt
1 e 6. t x t 1e6.txt 1e6.txt
代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("1e6.txt","w",stdout);//输出到文件
int n = 1e6;//数据量的大小
srand(time(NULL));//随机数种子
for(int i=0;i<n;i++)
printf("%d ",(abs(rand())+n)%n);
return 0;
}
排序算法
将会进行以下几种排序算法比较,
分别比较它们的
- 运行时间:(ms)
- 交换次数:
- 移动次数:
八中排序算法:
- 插入排序 ( I n s e r t S o r t ) (InsertSort) (InsertSort)
- 折半插入排序 ( B I n s e r t S o r t ) (BInsertSort) (BInsertSort)
- 希尔排序 ( S h e l l S o r t ) (ShellSort) (ShellSort)
- 冒泡排序 ( B u b b l e S o r t ) (BubbleSort) (BubbleSort)
- 简单选择排序 ( S e l e c t S o r t ) (SelectSort) (SelectSort)
- 快速排序 ( Q u i c k S o r t ) (QuickSort) (QuickSort)
- 堆排序 ( H e a p S o r t ) (HeapSort) (HeapSort)
- 归并排序 ( M e r g e S o r t ) (MergeSort) (MergeSort)
性能比较
这些排序算法的性能比较如上图所示,我们通过时间复杂度可以看出, O ( n 2 ) O(n^2) O(n2)的算法肯定是最慢的,而堆排序,快速排序,归并排序的平均时间复杂度是 O ( n   l o g   n ) O(n\,log\,n) O(nlogn),显然比其他算法快一些。
我们用这些算法对相同的随机数据进行排序,观察一下它们的运行时间,移动次数,交换次数,来进行更加直观的分析。
运行时间比较(ms)
排序算法 数据大小 | 1e3 | 1e4 | 1e5 | 1e6 |
---|---|---|---|---|
InsertSort | 1 | 87 | 7809 | 889262 |
BInsertSort | 1 | 75 | 6828 | 838490 |
ShellSort | 0 | 1 | 37 | 413 |
BubbleSort | 3 | 1 | 39693 | 3890712 |
QuickSort | 0 | 1 | 15 | 151 |
SelectSort | 1 | 120 | 11775 | 1131986 |
HeapSort | 0 | 2 | 21 | 564 |
MergeSort | 0 | 1 | 23 | 184 |
我们观察运行时间(单位ms),数据是1e3的时候看不出来大的差别,但是当数据逐渐增多,不同的算法排序所用的时间差别也越来越大!
在数据为1e6的时候,快速排序将1e6的数据排完序仅用了0.1s,而冒泡排序将这些数据排序成功需要花费一个多小时,现在我们做的才仅仅是百万级别的数据,和普通的算法相比,优秀的算法要比它快三万倍。
在这个大数据的时代,算法的重要性不言而喻。
移动次数比较
排序算法 数据大小 | 1e3 | 1e4 | 1e5 | 1e6 |
---|---|---|---|---|
InsertSort | 251935 | 24834732 | 2498350057 | 249759429861 |
BInsertSort | 251944 | 24834740 | 2498350073 | 249759429905 |
ShellSort | 11041 | 204402 | 3532741 | 52682333 |
BubbleSort | 250945 | 24824741 | 2498250074 | 249758429906 |
QuickSort | 4770 | 61112 | 763306 | 8243154 |
SelectSort | 995 | 9990 | 99988 | 999957 |
HeapSort | 10553 | 139191 | 1725178 | 20549336 |
MergeSort | 19952 | 267232 | 3337856 | 39902848 |
交换次数比较
排序算法 数据大小 | 1e3 | 1e4 | 1e5 | 1e6 |
---|---|---|---|---|
InsertSort | 990 | 9991 | 99983 | 999955 |
BInsertSort | 999 | 9999 | 99999 | 999999 |
ShellSort | 3834 | 57433 | 763790 | 8369173 |
BubbleSort | 250945 | 24824741 | 2498250074 | 249758429906 |
QuickSort | 697 | 6929 | 74695 | 867486 |
SelectSort | 995 | 9990 | 99988 | 999957 |
HeapSort | 10553 | 139191 | 1725178 | 20549336 |
MergeSort | 250945 | 24824741 | 2498250074 | 249758429906 |
本文仅代表个人观点。