本帖最后由 沈可 于 2014-1-14 22:31 编辑
//每次用划分函数将数组划分为2部分,接下来递归对2部分进行快速排序。
//选这一段区间中的任意一个数为基准,进行元素交换,并找到一个下标,使下标左边的数都小于基准数,右边的都大于基准数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 6, 2, 1, 7, 7, 1, 3, 7 };
QuickSort(arr, 0, arr.Length - 1);
foreach (int i in arr)
Console.WriteLine(i);
Console.ReadKey();
}
static int Partition(int[] arr, int l, int r)
{
int x = arr[l]; //基准值
l--; r++;
while (true)
{
do
{
l++;
}
while (arr[l] < x); //自左向右找到一个不小于x的元素
do
{
r--;
}
while (arr[r] > x); //自右向左找到一个不大于x的元素
if (l < r) //没有找到划分界限之前
{
//交换2个元素
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
}
else break; //找到界限了
}
return r; //界限是r
}
static void QuickSort(int[] arr, int l, int r)
{
if (l < r)
{
int t = Partition(arr, l, r);
QuickSort(arr, l, t);
QuickSort(arr, t + 1, r);
}
}
}
}
|