快速排序基本思想:通过一趟排序将待排记录分成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字要小,则可继续对这两部分记录进行排序,以达到整个序列有序的目的。。。
下面是一个快排的Demo:
using System;
using System.Collections.Generic;using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 快速排序
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
int[] arr={50,10,90,30,70,40,80,60,20};
QuickSort(arr);
for (int i = 0; i <arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
}
private static void QuickSort(int[] arr)
{
QSort(arr,0,arr.Length-1);
}
private static void QSort(int[] arr, int low, int high)
{
int pivot;
if (low < high)
{
//获得关键字(枢轴)
pivot = Partition(arr,low,high);
//将关键字左边的在调用QSort排序
QSort(arr,low,pivot-1);
//将右边的在排序
QSort(arr,pivot+1,high);
}
}
private static int Partition(int[] arr, int low, int high)
{
//将数组的第一个值作为关键字
int pivotkey = arr[low];
while (low < high)
{
//从后边开始比较,如果比关键字大,下标减一,在比较,如果小,交换
while(low < high && arr[high] >= pivotkey)
high--;
swap(arr,low,high);
//再从前边开始比较,若比关键字大,交换,否则,下标加一,循环比较,知道low==high
while (low < high && arr[low] <= pivotkey)
low++;
swap(arr,low,high);
}
return low;
}
//两个数两两交换
private static void swap(int[] arr, int low, int high)
{
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
}
}