zoukankan      html  css  js  c++  java
  • 快速排序、归并排序、堆排序三种算法性能比较

    快速排序、归并排序、堆排序三种排序算法的性能谁最好呢?网上查了一下说快速排序最快、其次是归并排序,最差的是堆排序;而理论上三种排序算法的时间复杂度都是O(nlogn),只不过快速排序最差的会达到O(n^2),但是数据的随机性会消除这一影响,今天就来实际比较一下:

      1 #include <iostream>
      2 #include<time.h>
      3 using namespace std;
      4 #define MAX 100000000
      5 int data1[MAX],data2[MAX],data3[MAX],temp[MAX];
      6  //快速排序
      7 void QuickSort(int data[],int i,int j)
      8 {
      9     if(i>=j) return;
     10     int low = i;
     11     int high = j;
     12      int key = data[low];
     13      while(low<high)
     14      {
     15            while(high>low && data[high]>=key) --high;
     16            data[low] = data[high];
     17            while(low<high && data[low]<key) ++low;
     18            data[high] = data[low];
     19      }
     20      data[low] = key;
     21      QuickSort(data,i,low-1);
     22      QuickSort(data,low+1,j);
     23 }
     24 //归并排序
     25 
     26 void MergeJudge(int data[],int first,int mid,int last,int temp[])
     27 {
     28        int k=0;
     29        int i=first,j = mid+1;
     30        while(i<=mid && j<=last)
     31        {
     32            if(data[i] < data[j])
     33                temp[k++] = data[i++] ;
     34            else
     35                temp[k++] = data[j++] ;
     36        }
     37        while(i<=mid) temp[k++] = data[i++];
     38        while(j<=last) temp[k++] = data[j++];
     39        for(int i = 0;i<k;i++) data[first+i] = temp[i];
     40 }
     41 
     42 void MergeSort(int data[],int first,int last,int temp[])
     43 {
     44     if(first>=last) return;
     45     int mid = (first + last) /2;
     46     MergeSort(data,first,mid,temp);
     47     MergeSort(data,mid+1,last,temp);
     48     MergeJudge(data,first,mid,last,temp);
     49 }
     50 
     51 inline void swap(int& a,int& b)
     52 {
     53     int t = a;
     54     a = b;
     55     b = t;
     56 }
     57 //堆排序
     58 void HeapJudge(int data[],int index,int n)
     59 {
     60     while(index<n)
     61     {
     62           int left = index * 2 + 1;
     63           int right = index * 2 + 2;
     64           int max = index;
     65           if(left<n && data[max] < data[left])  max = left;
     66           if(right<n && data[max] < data[right]) max = right;
     67           if(max == index) break;
     68           swap(data[max],data[index]);
     69           index = max;
     70     }                                                       
     71 }
     72 
     73 
     74 
     75 void HeapSort(int data[],int n)
     76 {
     77      for(int i=n/2-1 ; i>=0 ; i--)
     78      {
     79          HeapJudge(data,i,n);
     80      }
     81      for(int i = n-1;i>=0;i--)
     82      {
     83          swap(data[0],data[i]);
     84          HeapJudge(data,0,i);
     85      }
     86 }
     87 
     88 void print(int data[],int n)
     89 {
     90     for(int i=0;i<n;i++)
     91     {
     92         printf("%d ",data[i]);
     93     }
     94     printf("
    ");
     95 }
     96 bool check(int data[],int n)
     97 {
     98      for(int i=0;i<n-1;i++)
     99      {
    100          if(data[i]>data[i+1]) return false;
    101      }
    102      return true;
    103 }
    104 int main()
    105 {
    106 srand(unsigned int(time(0)));
    107     while(1)
    108     {
    109 
    110        int n;
    111        scanf("%d",&n);
    112        for(int i=0;i<n;i++)
    113        {
    114            data1[i] = rand();
    115            data2[i]=data1[i];
    116            data3[i]=data1[i];
    117        }
    118       printf("数据数量:%d
    ",n);
    119       double start = clock();
    120       QuickSort(data1,0,n-1);
    121       double end = clock();
    122       if(n<=10) print(data1,n);
    123       printf("快速排序:%.02lf ms
    ",end-start);
    124       if(!check(data1,n)) printf("快速排序出错!");
    125 
    126       start = clock();
    127       MergeSort(data2,0,n-1,temp);
    128       end = clock();
    129       if(n<=10) print(data2,n);
    130       printf("归并排序:%.02lf ms
    ",end-start);
    131       if(!check(data2,n)) printf("归并排序出错!");
    132 
    133       start = clock();
    134       HeapSort(data3,n);
    135       end = clock();
    136       if(n<=10) print(data3,n);
    137       printf("堆排序:%.02lf ms
    ",end-start);
    138       if(!check(data3,n)) printf("堆排序出错!");
    139     }
    140 
    141       return 0;
    142 }

    从上面数据可以看得出来:在数据量小的时候快速排序当属第一,堆排序最差,但随着数据的不断增大归并排序的性能会逐步赶上并超过快速排序,性能成为三种算法之首。可能在数据量大到一定数量时,快速排序的堆栈开销比较大,所以在性能上大打折扣,甚至堆排序的性能也能好过它,但总体上来说快速排序表现的还是比较优秀的。

  • 相关阅读:
    web.xml配置文件详解
    spring MVC配置文件详解
    路由导航刷新后导致当前选中的导航样式不见的解决办法
    vue input 使用v-model想要改变父属性的写法
    JS 编写一个指定范围内的随机数返回方法
    vue-router 3.1.5报错:vue-router.esm.js?8c4f:2089 Uncaught (in promise)
    Failed to mount component: template or render function not defined. vue
    vscode 操作debugger for chrome的配置文件写法
    JS操作DOM方法总结
    npm 代理配置的方法
  • 原文地址:https://www.cnblogs.com/yu-chao/p/4324485.html
Copyright © 2011-2022 走看看