C# 快速排序

快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。1.分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n],使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。2.解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. r]排序。 3.合并:由于两个子序列是就地排序的,所以对它们的合并不需要操作,整个序列L[m .. n]已排好序。

 

 private static ArrayList getArray(ArrayList num)//传入需要排序的动态数组num
        {
            ArrayList aLeft = new ArrayList();
            ArrayList aRight = new ArrayList();

            int k = Convert.ToInt32(num[0]);//以第一个数为关键数

            for (int j = 1; j < num.Count; j++)
            {
                int m=Convert.ToInt32(num[j]);
                if ( m< k)
                {
                    aLeft.Add(m);//小于关键数的放在一个新数组中
                }
                else
                {
                    aRight.Add(m);//其它的放在另一个新数组中
                }
            }

            if (aLeft.Count > 0)
                aLeft = getArray(aLeft);
            if (aRight.Count > 0)
                aRight = getArray(aRight);//递归调用排序方法,直到所有新数组中的元素个数为1时终止
            
            num.Clear();//清空以前数组中的值,便于重新组合

            num.AddRange(aLeft);
            num.Add(k);
            num.AddRange(aRight);//将左右两边已排好的数组和关键数按顺序组合成新的有序数组

            return num;
        }

posted @ 2009-04-30 16:58  鲤伴先生  Views(131)  Comments(0)    收藏  举报