天天看点

排序总结——————数据结构

文章目录

  • ​​八中排序方式的对比​​
  • ​​数据生成​​
  • ​​排序算法​​
  • ​​性能比较​​
  • ​​运行时间比较(ms)​​
  • ​​移动次数比较​​
  • ​​交换次数比较​​

八中排序方式的对比

数据生成

我采用随机函数来生成随机数据,将生成的数据保存在.txt文件里

生成的数据大小范围在内,生成的数据完全是随机的

其中

采用当前时间来作为随机数种子

srand(time(NULL));//随机数种子      

生成的数据将保存在文件名为以下的文件里

代码如下

#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)
  • 交换次数:
  • 移动次数:

八中排序算法:

  1. 插入排序
  2. 折半插入排序
  3. 希尔排序
  4. 冒泡排序
  5. 简单选择排序
  6. 快速排序
  7. 堆排序
  8. 归并排序

性能比较

排序总结——————数据结构

这些排序算法的性能比较如上图所示,我们通过时间复杂度可以看出,的算法肯定是最慢的,而堆排序,快速排序,归并排序的平均时间复杂度是,显然比其他算法快一些。

我们用这些算法对相同的随机数据进行排序,观察一下它们的运行时间,移动次数,交换次数,来进行更加直观的分析。

运行时间比较(ms)

排序算法 数据大小 1e3 1e4 1e5 1e6
InsertSort 1 87 7809 889262
BInsertSort 1 75 6828 838490
ShellSort 1 37 413
BubbleSort 3 1 39693 3890712
QuickSort 1 15 151
SelectSort 1 120 11775 1131986
HeapSort 2 21 564
MergeSort 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

继续阅读