排序算法之快速排序
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("\n-------------快速排序 排序后--------------"); 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); } } }