C#快速排序法

最近面试的时候,被问到了快速排序法。一时之间,无法想起算法来。

重新看了书本,算法如下:

  1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;

  2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];

  3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值a[j],并与key交换;

  4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的a[i],与key交换;

  5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)

 

C#代码:

       void QSort<T>(T[] array)where T :IComparable
        {
            QuackSort<T>(array, 0, array.Length-1);
        }

        void QuackSort<T>(T[] array,int left,int right)where T:IComparable
        {
            if (left < right)
            {
                int middle = Partition<T>(array, left, right);
                QuackSort<T>(array, left, middle - 1);
                QuackSort<T>(array, middle + 1, right);
            }
        }

        int Partition<T>(T[] array, int left, int right)where T:IComparable
        {
            T key = array[left];
            while (left<right)
            {
                while (left < right && key.CompareTo(array[right]) < 0)
                {
                    right--;
                }
                if (left < right)
                {
                    T temp = array[left];
                    array[left] = array[right];
                   array[right] = temp;
                    left++;
                }
                while (left < right && key.CompareTo(array[left]) > 0)
                {
                    left++;
                }
                if (left < right)
                {
                    T temp = array[left];
                    array[left] = array[right];
                    array[right] = temp;
                    right--;
                }
                array[left] = key;
            }
            return left;
        }

调用如下:

        static void Main(string[] args)
        {
            int[] array = new int[]{ 49, 38, 65, 97, 76, 13, 27 };
            Program program = new Program();
            program.QSort<int>(array);
            foreach (var item in array)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }

 

posted @ 2014-09-10 21:28  无眠  阅读(507)  评论(1编辑  收藏  举报