快速排序的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.

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

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

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

算法导论第七章思考题7-2针对相同元素的快速排序-c++

#include "stdafx.h" #include #include #include #include #include using namespace std; typedef s...
  • qq_31567335
  • qq_31567335
  • 2016年10月04日 02:04
  • 431

算法导论-----排序的9种实现(C/C++)

目录 A、冒泡排序 B、选择排序 C、插入排序 D、折半插入排序 E、归并排序 F、快速排序 G、希尔排序 堆排序、基数排序、桶排序后续补充。。。。。A、冒泡排序冒泡排序有很多种实现方式。下面总结常见...
  • so_geili
  • so_geili
  • 2016年11月23日 23:30
  • 1109

算法导论第七章总结:快速排序

算法导论第七章总结         对于包含 n 个数的输入数组来说,快速排序是一种最坏时间复杂度为 Θ(n2) 的排序算法。虽然最坏情况时间复杂度很差,但快速排序通常书实际应用中最好的选择,因为它...
  • LuckyJune34
  • LuckyJune34
  • 2015年06月09日 21:05
  • 1482

MIT算法导论-第四讲-快速排序

1.快速排序的描述快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:(1)分解:数组A[p…r]被划分为两个(可能为空)子数组A[p…q-1]和A[q+1…r],给定一...
  • qing0706
  • qing0706
  • 2015年11月28日 16:38
  • 1067

算法导论第三版习题6.5

6.5-1(a) 首先直接提取max=A[1]=15max = A[1] = 15; (b) 然后令A[1]=A[heap_size]=1A[1]=A[heap\_size]=1,让heap_siz...
  • obguy
  • obguy
  • 2016年02月28日 14:08
  • 1015

结合题目讲解“快速排序算法”

根据一道快速排序算法自考题,进行学习方法上的反思,同时讲解自己对快速排序算法的理解...
  • sun15732621550
  • sun15732621550
  • 2016年10月16日 16:44
  • 2281

C#实现快速排序算法

快速排序算法:
  • makenothing
  • makenothing
  • 2014年04月29日 15:46
  • 952

【算法导论】快速排序

快速排序 快速排序的最坏运行时间为n2,虽然这最坏情况的时间复杂度比较大,但快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,平均时间复杂度为nlgn,并且nlgn中的隐含常数因子很小。...
  • tengweitw
  • tengweitw
  • 2013年07月30日 14:25
  • 1439

java编程题:用Java实现一个快速排序算法

/** * java编程题:用Java实现一个快速排序算法 * * 快速排序是对冒泡排序的一种改进。 * * 快速排序的基本思想: * 通过一趟排序将要排序的数据分成独立的两部分,...
  • min996358312
  • min996358312
  • 2017年03月23日 14:32
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序的C#实现以及,算法导论上之后一个习题的思考
举报原因:
原因补充:

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