回 帖 发 新 帖 刷新版面

主题:[原创]C#中的快速排序算法


                        快速排序
    首先在待排序的文件中(R1,R2...Rn)中,选一个Ri,经过比较和移动后,将Ri 放在中间适当的位

置,使得Ri左边的数据均小于Ri,其右边的数据均大于Ri.于是,以Ri为边界,将文件划分为两个子文件

,为同样的方法分别对这两个文件进行划分,得到四个更小的文件,继续进行下去,使每个记录均有一

个记录为止.就得到原文件的有序文件.  
   排序时<我们不妨选择记录R1对文件进行划分.使用指针(下标变量)i 和j 分别从文件的两端向中

间方向进行扫描,指针i从第二个记录向右扫描.找到记录Ri,有Ki>K1时为止.指针j从最后一个记录开

始找到记录Rj<R1是为止.这时如果是i<j,交换Ri和Rj的位置.指针继续向中间扫描,再找一对Ri,Rj
i<j && Ri>Rj 交换Ri, Rj 的位置.直到i>j时为止.最后交换 R1 和Rj的位置.使R1到了正确的位

置,并将文件划分为左,右两个子文件.
有这方面的爱好者,欢迎跟贴,我们可以共同计论,共同进步.欢迎高手们提出批评和建意
下面是C#实例;


using System;
   
namespace QuickSorter
{
    public class QuickSorter
    {
        private void Swap(ref int l,ref int r)
        {
            int s;
            s=l;
            l=r;
            r=s;
        }
        public void Sort(int[] list,int low,int high)
        {
            int pivot;
            int l,r;
            int mid;
            if(high<=low)
                return;
            else if(high==low+1)
            {
                if(list[low]>list[high])
                    Swap(ref list[low],ref list[high]);
                return;
            }
            mid=(low+high)>>1;
            pivot=list[mid];
            Swap(ref list[low],ref list[mid]);
            l=low+1;
            r=high;
            do
            {
            while(l<=r&&list[l]<pivot)
                l++;
            while(list[r]>=pivot)
                r--;
                if(l<r)
                    Swap(ref list[l],ref list[r]);
            }
            while(l<r);
            list[low]=list[r];
            list[r]=pivot;
            if(low+1<r)
                 Sort(list,low,r-1);
            if(r+1<high)
                Sort(list,r+1,high);
        }
    }
    public class MainClass
    {
        public static void Main()
        {
            int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};
            QuickSorter q=new QuickSorter();
            q.Sort(iArrary,0,13);
            for(int m=0;m<=13;m++)
                Console.WriteLine("{0}",iArrary[m]);
        }
    }
   
}

回复列表 (共10个回复)

沙发

qsort是我认为的最经典的一种排序方法之一!
顶!

板凳

用堆栈还是用文件还是用数组指针,
对于大量的数据来说很重要的,
用堆栈会溢出,用文件会影响速度。

3 楼

RE:qsort是我认为的最经典的一种排序方法之一!

不错,就是不稳定,堆排序,Shell排序都还不错

欢迎访问我的网站CSharp讨论区,如有问题请大家一起讨论
http://blog.chinaunix.net/index.php?blogId=7730

4 楼

早听过C#的大名,怎么看上去跟C++差不多????

5 楼

zouyu1983
呵呵,它就是比c++多了两个+

6 楼

非也非也....C#是把C++的两个加号在了一起
哈哈哈哈

7 楼

哈哈 传说中的2分法!!!
结构学得不错!

8 楼

还行

9 楼

c#=c++++

10 楼

有错误,比如把代码中
int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47}; 
换成
int[] iArrary=new int[]{75,1,5,3,6,10,55,9,2,87,12,34,33,47};
就不行了,说索引超出数组界限
(在VS2005验证)

我来回复

您尚未登录,请登录后再回复。点此登录或注册