百科名片:
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace QuickSort
{
class Program
{
static int iNo = 0; //排序步骤标志
static void Main(string[] args)
{
iNo = 0;
int[] ary = new int[8] { 2, 4, 9, 3, 6, 7, 1, 5 };
ShowAryNumbers(ary, 0, 0); //显示原始数组,iNo=0
QuickSort(ary, 0, ary.Length - 1); //调用递归快速排序方法
Console.ReadLine();
}
/// <summary>
/// 递归进行快速排序
/// </summary>
/// <param name="v">源数组</param>
/// <param name="left">排序起始点</param>
/// <param name="right">排序结束点</param>
static private void QuickSort(int[] v, int left, int right)
{
if (left < right)
{
int key = v[left];
int low = left;
int high = right;
//先右往左扫描再左往右扫描。若要颠倒先后顺序,具体算法得调整
while (low < high)
{
while (low < high && v[high] > key) //从右往左扫描
{
high--;
}
v[low] = v[high];
ShowAryNumbers(v, high, low); //显示当前数组排序情况
while (low < high && v[low] < key) //从左往右扫描
{
low++;
}
v[high] = v[low];
ShowAryNumbers(v, low, high); //显示当前数组排序情况
}
v[low] = key;
QuickSort(v, left, low - 1);
QuickSort(v, low + 1, right);
}
}
/// <summary>
/// 显示当前数组排序情况
/// </summary>
/// <param name="v">排序过的数组</param>
/// <param name="iSource">源位置</param>
/// <param name="iTarget">目标位置</param>
static void ShowAryNumbers(int[] v, int iSource, int iTarget)
{
string strRtn = "";
if (v.Length > 0)
{
strRtn += (iNo++).ToString() + ": ";
foreach (int i in v)
{
strRtn += i + " ";
}
strRtn += " action:" + iSource.ToString() + "->" + iTarget.ToString();
}
if (strRtn.Length > 0)
Console.WriteLine(strRtn);
}
}
}
运行结果: