///使用递归原理,通过一趟排序将要排序的数据分割成独立的两部分,
///其中一部分的所有数据都比另外一部分的所有数据都要小,
///然后再按此方法对这两部分数据分别进行快速排序
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Class1
{
public static void QuickSort(int[] intArray, int nLower, int nUpper)
{
if (nLower < nUpper)
{
int nSplit = Partition(intArray, nLower, nUpper);
///递归排序
QuickSort(intArray, nLower, nSplit - 1);
QuickSort(intArray, nSplit + 1, nUpper);
}
}
/// <summary>
/// 方法参数:原始数组、第一个元素位置、最后元素位置
/// 方法功能:完成一趟快速排序
/// </summary>
/// <param name="intArray"></param>
/// <param name="nLower"></param>
/// <param name="nUpper"></param>
/// <returns></returns>
static int Partition(int[] intArray, int nLower, int nUpper)
{
int nLeft = nLower + 1;
///以数组第一个元素值作为支点
int nPivot = intArray[nLower];
int nRight = nUpper;
int nSwap;
while (nLeft <= nRight)
{
///从左向右寻找大于支点元素
while (nLeft <= nRight && intArray[nLeft] < nPivot)
nLeft++;
///从右向左寻找小于支点元素
while (nLeft <= nRight && intArray[nRight] >= nPivot)
nRight--;
///交换nLeft和nRight位置元素值
if (nLeft < nRight)
{
nSwap = intArray[nLeft];
intArray[nLeft] = intArray[nRight];
intArray[nRight] = nSwap;
nLeft++;
nRight--;
}
}
///以intArray[nRight]为新支点
nSwap = intArray[nLower];
intArray[nLower] = intArray[nRight];
intArray[nRight] = nSwap;
return nRight;
}
}
public class MainClass
{
static void Main(string[] args)
{
int[] a = new int[9] { 8, 6, 3, 5, 4, 9, 1, 2, 7 };
Class1.QuickSort(a, 0, a.Length - 1);
foreach (int i in a)
Console.WriteLine(i);
Console.ReadLine();
}
}