C#之快速排序


快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序的基本概念是
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,
然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
下面通過一個例子來了解快速排序的具體含義:
 { 23, 45, 60, 10, 17, 101,12}
第一遍排序:

由此思想,我們可以實現快速排序的代碼:
注意基准數據永遠不變,永遠是和基准數據進行比較,無論在什么位置,最后的目的就是把基准數據放在中間,小的放前面大的放后面。

namespace QuickSort
{
    class QuickSort
    {
        private int  Func(int[] n, int left, int right)
        {
            int baseNum = n[left]; // 基准數據

            int i = left;
            int j = right;
            while (true)
            {
                if (n[i] < baseNum && i < j)
                {
                    i++;
                }
                else if (n[i] > baseNum && i < j)
                {
                    int number = n[i];
                    n[i] = n[j];
                    n[j] = number;
                    j--;
                }
                else if (n[j] < baseNum && i < j)
                {
                    int number = n[i];
                    n[i] = n[j];
                    n[j] = number;
                    i++;
                }
                else if (n[j] > baseNum && i < j)
                {
                    j--;
                }
                else if (i == j)
                {
                    n[i] = baseNum;
                    break;
                }
            }
            return i;
        }

        public void QuickSortFunc(int[] n, int left, int right)
        {
            //左下標一定小於右下標,否則就超越了
            if (left < right)
            {
                //對數組進行分割,取出下次分割的基准標號 
                int i = Func(n, left, right);

                //對“基准標號“左側的一組數值進行遞歸的切割,以至於將這些數值完整的排序
                QuickSortFunc(n, left, i - 1);

                //對“基准標號“右側的一組數值進行遞歸的切割,以至於將這些數值完整的排序
                QuickSortFunc(n, i + 1, right);

            }
        }
        static void Main(string[] args)
        {
            int[] n = { 23, 45, 60, 10, 17, 101,12};
            QuickSort qs = new QuickSort();
            qs.QuickSortFunc(n, 0, n.Length - 1);
            for (int i = 0; i < n.Length; i++)
            {
                Console.WriteLine(n[i]);
            }

            Console.ReadLine(); 
        }
    }
}

其實我們還可以取中間的數作為基准,具體示例如下:

        private  void Sort(int[] numbers, int left, int right)
        {
             //左邊索引小於右邊,則還未排序完成   
               if (left < right)
            {
                //取中間的元素作為比較基准,小於他的往左邊移,大於他的往右邊移   
                   int middle = numbers[(left + right) / 2];
                int i = left - 1;
                int j = right + 1;
                while (true)
                {
                    while (numbers[++i] < middle && i < right) ;
                    while (numbers[--j] > middle && j > 0) ;
                    if (i >= j)
                        break;
                    Swap(numbers, i, j);

                }        
                Sort(numbers, left, i - 1);
                Sort(numbers, j + 1, right);

                for (int k = 0; k < numbers.Length; k++)
                {
                    Console.WriteLine(numbers[k]);
                }
                Console.ReadLine(); 
            }           
        }

        private  void Swap(int[] numbers, int i, int j)
        {
            int number = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = number;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM