【问题标题】:In which situations is Quicksort faster than Bubblesort? Why? [closed]在哪些情况下快速排序比冒泡排序更快?为什么? [关闭]
【发布时间】:2017-01-30 01:53:28
【问题描述】:

快速排序:

void Quicksort(int array[], int left, int right){
     int pivot = left, i,ch,j;
     for(i=left+1;i<=right;i++){
         j = i;
         if(array[j] < array[pivot]){
          ch = array[j];
          while(j > pivot){
             array[j] = array[j-1];
             j--;
          }
          array[j] = ch;
          pivot++;
         }  
     }
     if(pivot-1 >= left){
         quick(array,left,pivot-1);
     }
     if(pivot+1 <= right){
         quick(array,pivot+1,right);
     }
  }

冒泡排序:

void Bubblesort(int array[])
{
    int length = array.length;
    int i,j,r,aux;
    for(i=length-1; i >= 1; i--) 
    {  
        for(j=0; j < i ; j++) 
        {
            if(array[j]>array[j+1]) 
            {
                aux = array[j];
                array[j] = array[j+1];
                array[j+1] = aux;
            }
        }
    }

    for(k = 0; k < length; ++k)
    {
        printf("%d\n",array[k]);
    }
}

最坏情况:

快速排序:n²

冒泡排序:n²

平均情况:

快速排序:nlog(n)

冒泡排序:n²

通常,这意味着快速排序往往比冒泡排序更快。

但在哪些情况下快速排序比冒泡排序更快?

请记住,当列表已经几乎排序时,快速排序将继续递归,对于非常小的集合,冒泡排序可以更快。

【问题讨论】:

  • 视情况而定。对于非常小的集合,冒泡排序可以更快,但大多数时候快速排序会更快。
  • 跨站欺骗/相关:cs.stackexchange.com/questions/3/…。另外你真的应该先使用谷歌。已经有很多这方面的信息了。
  • 是的,是的,不能总是依赖快速排序,尤其是因为选择了枢轴。
  • "快速排序比冒泡排序快吗?" - 对于要排序的非平凡大小的集合:Yes 在大多数 情况下。但是,在大多数情况下,如果排序不是您的应用程序最性能关键的部分,您可能不必太担心,只需使用std::sort :)
  • 那些 big-O 参数仅在 n 很大时才适用,因此任何常数因素或开销都会被淹没。当 n 很小时,常数因子和开销会占主导地位。即使在具有相同大 O 的算法中,常数因子和开销也占主导地位。他们不会费心在课堂上提到这一点。此外,快速排序的最坏情况下的性能很容易通过微不足道的更改来弥补。

标签: c++ performance optimization quicksort bubble-sort


【解决方案1】:

所以通常,这意味着快速排序会比冒泡排序更快?

是的。快得多。

请记住,当列表已经几乎排序时,快速排序将继续递归。

是的。快速排序的最坏情况是一个大问题,因此如果不进行修改,它通常不是现实世界使用的首选算法。

【讨论】:

  • Re: 第 2 点 --- 但是,通过对纯快速排序进行一些简单的更改,可以很容易地发现许多这些“边缘情况”的低效率
  • @AlexW: Introsort 例如。
  • @AlexW 编辑澄清。但通常只选择一种不同的排序来避免该问题,例如堆排序。
  • 冒泡排序将在完成后立即停止,从而在这种情况下使冒泡排序更快。
  • 快速排序最坏的情况将是nlog(n),如果确保将在数组中间选择枢轴。
猜你喜欢
  • 2018-03-28
  • 2011-11-30
  • 2022-01-15
  • 2017-03-18
  • 2019-02-26
  • 2018-05-24
  • 2021-11-24
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多