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)。