QuickSort以中间elemenet为枢轴

时间:2018-06-06 15:18:00

标签: algorithm sorting quicksort

我正在尝试搜索有关快速排序如何使用中间元素作为数据透视的任何解释,但我找不到任何解释。我想要寻找的是有关如何逐步对数字进行排序的任何演示,因为它非常难以理解算法。感谢。

2 个答案:

答案 0 :(得分:2)

垂直条围绕枢轴:

 61 11 93 74 75 21 12|55|81 19 14 86 19 79 23 44
 44 11 23|19|14 21 12 19                        
 19|11|12 14                                    
 11                                             
    19|12|14                                    
    12                                          
      |19|14                                    
       14                                       
          19                                    
             19|21|23 44                        
            |19|21                              
             19                                 
                21                              
                  |23|44                        
                   23                           
                      44                        
                         81 55 75|86|74 79 93 61
                         81 55|75|61 74 79      
                         74|55|61               
                         55                     
                           |74|61               
                            61                  
                               74               
                                  75|81|79      
                                 |75|79         
                                  75            
                                     79         
                                        81      
                                          |93|86
                                           86   
                                              93
 11 12 14 19 19 21 23 44 55 61 74 75 79 81 86 93

基于Hoare分区方案的这种变化:

void QuickSort(int a[], int lo, int hi) {
    int i, j, p;
    if (lo >= hi)
        return;
    i = lo - 1;
    j = hi + 1;
    p = a[(lo + hi)/2];
    while (1)
    {
        while (a[++i] < p) ;
        while (a[--j] > p) ;
        if (i >= j)
            break;
        swap(a+i, a+j);
    }
    QuickSort(a, lo, j);
    QuickSort(a, j + 1, hi);
}

请注意,在分区步骤之后,枢轴可以在左侧或右侧部分结束。

答案 1 :(得分:0)

Quicksort选择一个透视值并将较小的元素移动到数组的开头,将较大的元素移动到结尾。这是通过从两端重复扫描直到找到一对大/小并进行交换来完成的。

在这样的分区过程之后,所有小于枢轴的元素都存储在大于枢轴的元素之前。然后递归地在两个子阵列上重复该过程。当然,当一个子阵列减少到一个或两个元素时,对它们进行排序是微不足道的。

回想一下,如果数组中至少有一个元素较小且一个较大,则可以任意选择透视值。