快速排序的C#实现以及,算法导论上之后一个习题的思考

原创 2007年10月08日 11:08:00
//Divide: Partition (rearrange) the array A[p ‥ r] into two (possibly empty) subarrays A[p ‥ q - 1] 
//  and A[q + 1 ‥ r] such that each element of A[p ‥ q - 1] is less than or equal to A[q], which is, in turn, 
//  less than or equal to each element of A[q + 1 ‥ r]. Compute the index q as part of this partitioning procedure.
//Conquer: Sort the two subarrays A[p ‥ q -1] and A[q +1 ‥ r] by recursive calls to quicksort.
//Combine: Since the subarrays are sorted in place, no work is needed to combine them: the entire array A[p ‥ r] is now sorted.

namespace FengChen.Practices
...{
    
namespace Chapter7
    
...{
        
public class QuickSort
        
...{
            
private static bool m_NonDecreasing;
            
private static bool Ordered(Int32 A, Int32 B)
            
...{
                
if (m_NonDecreasing) return (A <= B);
                
else return (A >= B);
            }



            
private static void QuicksortDriver(Int32[] A, Int32 p, Int32 r)
            
...{
                
if (p >= r) return;
             
                Int32 q 
= Partition(A, p, r);
                QuicksortDriver(A, p, q 
- 1);
                QuicksortDriver(A, q 
+ 1, r);
            }


            
private static Int32 Partition(Int32[] A, Int32 p, Int32 r)
            
...{
                Int32 x 
= A[r]; // pivot
                Int32 i = p - 1;
                
for (Int32 j = p; j < r; j++)
                    
if (Ordered(A[j], x)) Common.Exchange(ref A[++i], ref A[j]);

                Common.Exchange(
ref A[++i], ref A[r]);
                
return i;
            }


            
/**//// <summary>
            
/// Sort the array to non decreasing order
            
/// </summary>
            
/// <param name="InputArray"></param>

            public static void Sort(Int32[] InputArray, bool Increasing)
            
...{
                m_NonDecreasing 
= Increasing;
                QuicksortDriver(InputArray, 
0, InputArray.Length - 1);
            }

        }

    }

}
 

这个实现倒并不难。可是请看算法导论后面的一个习题:
What value of q does PARTITION return when all elements in the array A[p r] have the same value? Modify PARTITION so that q = (p+r)/2 when all elements in the array A[p r] have the same value.

后面 的疑问目前我研究看来没有不极大伤害性能的解答。

快速排序的C语言实现(算法导论版)

  • 2012年11月02日 16:28
  • 961B
  • 下载

算法导论中的快速排序详解

数组中的数据有序是一个很好的性质,那么对一个数组中的数字的排序就是很常用的一个算法。一个例子就是二分查找的前提就是数组中的数据有序。     快速排序是最佳的排序方式。快排不仅实现原地排序,期望时间...
  • uestc_my
  • uestc_my
  • 2015-05-09 12:56:29
  • 491

算法导论第三版第七章思考题

7-1a.(1) 初始时,x=A[1]=13,i=0,j=13x=A[1]=13, i = 0, j = 13; (2) 令j=j−1=12,A[12]>xj=j-1=12,A[12]\gt x,故...
  • obguy
  • obguy
  • 2016-02-29 21:50:53
  • 1737

算法导论 - QuickSort 快速排序 C++实现

算法导论的快速排序还和一般书上的快速排序是有点不一样的。 当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。 书本介绍的排序可以用图看的很清晰: 然后配合C++...
  • kenden23
  • kenden23
  • 2013-11-09 10:32:47
  • 14303

《算法导论》第七章-快速排序(伪代码)

快速排序 伪代码:
  • huangxiaominglipeng
  • huangxiaominglipeng
  • 2014-10-16 11:41:48
  • 4631

算法导论第三版习题8.4

8.4-1(1) 首先n=A.length=10n=A.length=10,然后让B[0...9]B[0...9]分别为一个空链表; (2) 遍历数组AA,将数组AA中每一个元素A[i]A[i]都加...
  • obguy
  • obguy
  • 2016-03-02 21:53:27
  • 962

算法导论第三版习题7.4

7.4-1我们可以猜测T(n)≥cn2T(n)\ge cn^2: T(n)≥max0≤q≤n−1[cq2+c(n−q−1)2]+Θ(n)=max0≤q≤n−1[cq2+c(n−q−1)2]+Θ(n)...
  • obguy
  • obguy
  • 2016-02-29 17:16:44
  • 1603

【算法导论】排序 (三):快速排序 深入分析

五、快速排序 快速排序是最常用的一种排序算法,包括C的qsort,C++和Java的sort,都采用了快排(C++和Java的sort经过了优化,还混合了其他排序算法)。 快排最坏情况O(...
  • shuangde800
  • shuangde800
  • 2012-05-24 22:22:03
  • 4333

快速排序实现细节的思考

每次隔个一年或半年,回过来重新写快速排序代码,都不知如何入手。在此记录,以便翻阅。     网友MoreWindows对快速排序的总结非常好,挖坑填数+分治法。每一趟的快速排序QuickSortPar...
  • brk1985
  • brk1985
  • 2015-03-13 14:48:06
  • 477

《算法导论》第三章-思考题(参考答案)

算法导论(第三版)参考答案:思考题3.1,思考题3.2,思考题3.3,思考题3.4,思考题3.5,思考题3.6...
  • victoryaoyu
  • victoryaoyu
  • 2017-07-28 11:13:06
  • 575
收藏助手
不良信息举报
您举报文章:快速排序的C#实现以及,算法导论上之后一个习题的思考
举报原因:
原因补充:

(最多只允许输入30个字)