排序算法之快速排序

1.基本思想

它的基本思想是:选取第一个数作为基准数,设置左右两个指针,先从数组的尾部开始直到找到比基准数小的,然后这个数字赋值给头指针,接着从头指针开始直到找到比基准数大的数字,然后赋值给尾指针,直到左指针和右指针重合,通过这样的一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.时间复杂度

如果每次划分过程产生的区间大小都为n/2,由于快速排序法也是基于比较的排序法,其运行时间为Ω(nlogn),所以如果每次划分过程产生的区间大小都为n/2,则运行时间θ(nlogn)就是最好情况运行时间。

3.代码实现

 

namespace QuickSortPatt
{
    public class Program
    {
        static void Main(string[] args)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            int[] arry = { 9, 7, 12, 6, 8, 1 };
            Console.WriteLine("-------------排序前--------------");
            for (int i = 0; i < arry.Length; i++)
            {
                Console.Write(arry[i] + " ");
            }
            Sort(arry);
            Console.WriteLine("
-------------快速排序 排序后--------------");
            for (int i = 0; i < arry.Length; i++)
            {
                Console.Write(arry[i] + " ");
            }
            Console.ReadKey();
        }

        public static int Partition(int []arry ,int left,int right)
        {
            var baseNum = arry[left];
            while (left < right)
            {
                while (left < right && arry[right] > baseNum)
                    right--;
                arry[left] = arry[right];
                while (left < right && arry[left] < baseNum)
                    left++;
                arry[left] = arry[right];
            }
            arry[left] = baseNum;
            return left;
        }
        public static  void QuickSort(int []arry,int left,int right)
        {
            var pivpos = Partition(arry, left, right);
            QuickSort(arry, left, pivpos - 1);
            QuickSort(arry, pivpos + 1,right);
        }
        public static void Sort(int[] arr)
        {
            if (arr == null || arr.Length == 0)
                return;
            QuickSort(arr, 0, arr.Length - 1);
        }
    }
}

 

 

原文地址:https://www.cnblogs.com/smilejeffery/p/7218582.html