快速排序 C#解法

using System;

namespace 快速排序
{
    class Program
    {
        static void QuickSort(int[] array, int left, int right)
        {
            if (right - left <= 0) return;
            int pivot = array[right];
            int partition = PartitionIt(array, left, right, pivot); 
            QuickSort(array, left, partition - 1); 
            QuickSort(array, partition + 1, right); 
        }
        static int PartitionIt(int[] array, int left, int right, int pivot)
        {
            int leftPtr = left - 1;
            int rightPtr = right; 
            while (true)
            {
                while (array[++leftPtr] < pivot) { }
                while (rightPtr > 0 && array[--rightPtr] > pivot) { }
                if (leftPtr >= rightPtr) break;
                Swap(array, leftPtr, rightPtr);
            }
            Swap(array, leftPtr, right);
            return leftPtr;
        }
        static void Swap(int[] array, int a, int b)
        {
            int temp = array[a];
            array[a] = array[b];
            array[b] = temp;
        }
        static void Main(string[] args)
        {
            int[] array = new int[] { 2, 9, 5, 1, 8, 3, 6, 4, 7, 0 };
            foreach (int a in array)
                Console.Write(a+" ");
            Console.WriteLine("");
            Console.WriteLine("----");
            QuickSort(array, 0, array.Length - 1);
            foreach (int a in array)
                Console.Write(a + " ");
            Console.ReadKey();
        }
    }
}

思路:选择一个枢轴(数组中任意一个元素),用两个变量i和j从数组两边向中间扫,当i第一次遇到比枢轴元素大的时候停止移动,j同理,之后交换i和j,此时i左侧的数全部小于枢轴元素,j的右侧全部大于枢轴元素,交换i和枢轴,传回枢轴,将枢轴两侧的数组分为左数组和右数组,分别递归枢轴左侧和右侧,终止条件当i>=j时,即可完成排序。快排是目前已知排序算法中效率最高性能最好的一种,时间复杂度为O(nlogn)。

猜你喜欢

转载自blog.csdn.net/qq_43461641/article/details/89512847