男:约不约?
女:不约!
男:到底,约不约?
女:早说嘛,约!
using System;
namespace QuicklySortByJens
{
class MainClass
{
#region 建议::::::: 第一种快速排序的方法
//每次排序返回 下次进行分割排序的下标
public static int KeyValuePosition (int[] a, int low, int high)
{
//记录数组的起始位置
int leftIndex = low;
//记录数组的结束位置
int rightIndex = high;
//关键值, 通常为low下标所对应的元素值
int keyValue = a [low];
int temp;
//当左侧动态下标值 小于 右侧动态下标值时
while (leftIndex < rightIndex) {
//左侧动态下标值增加 直到 找到比关键值大的位置为止
while (leftIndex < rightIndex && a [leftIndex] <= keyValue) {
//每循环一次, 左侧动态下标值 向右走一个位置
leftIndex++;
}
//道理同上 直到 找到比关键值小的位置为止
while (leftIndex < rightIndex && a [rightIndex] > keyValue) {
rightIndex--;
}
//把左右侧动态下标所在的元素值进行交换
if (leftIndex < rightIndex) {
temp = a [leftIndex];
a [leftIndex] = a [rightIndex];
a [rightIndex] = temp;
}
}
//将关键值赋值给一个变量
temp = keyValue;
//判断关键值和相遇时的当前值的大小
//如果关键值 <= 相遇值, 就将相遇值前一个数与关键值 交换, 并返回前一个下标
//如果关键值 > 相遇值, 就直接将两者交互, 并返回相遇时的当前下标
//返回 交换后 关键值 所在的下标
//以下标所在的位置进行分割, 递归调用
if (temp <= a [rightIndex]) {
//交换a[low]和a[rightIndex - 1]的值, 返回下标值
a [low] = a [rightIndex - 1];
a [rightIndex - 1] = temp;
return rightIndex - 1;
} else {
a [low] = a [rightIndex];
a [rightIndex] = temp;
return rightIndex;
}
}
static void Sort (int[] a, int low, int high)
{
try {
//记录关键值的下标
int keyPosition;
//当传递的目标数组含有两个或者两个以上的元素时进行递归
if (low < high) {
//获取关键值所在数组的下标
keyPosition = KeyValuePosition (a, low, high);
//以关键值下标为分界线, 以左边的数值再进行上面的操作
//直到要参与排序的数据的个数为1, 即(log和high)的值相等时
//递归调用结束, 方法开始向外返出来
Sort (a, low, keyPosition - 1);
Sort (a, keyPosition + 1, high);
}
} catch (Exception ex) {
}
}
#endregion
#region 建议::::::: 第二种快速排序的方法
//http://developer.51cto.com/art/201403/430986.htm
static void QuickSortThree (int[] a, int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = a [left]; //temp中存的就是关键值
i = left;
j = right;
while (i != j) {
//顺序很重要,要先从右边开始找
//直到找到比关键值小的才停止
while (a [j] >= temp && i < j)
j--;
//再找右边的
////直到找到比关键值大的才停止
while (a [i] <= temp && i < j)
i++;
//交换两个数在数组中的位置
if (i < j) {
t = a [i];
a [i] = a [j];
a [j] = t;
}
}
//i = j时 ,最终将 关键值 与 相等的交换
a [left] = a [i];
a [i] = temp;
//分左右两侧进行递归排序
QuickSortThree (a, left, i - 1);//继续处理左边的,这里是一个递归的过程
QuickSortThree (a, i + 1, right);//继续处理右边的 ,这里是一个递归的过程
}
#endregion
#region 第三种快速排序的方法
static void QuickSort (int[]a, int left, int right)
{
if (left < right) {
int i = left;
int j = right;
int middle = a [(left + right) / 2];
while (true) {
while (i < right && a [i] < middle) {
i++;
}
while (j > 0 && a [j] > middle) {
j--;
}
if (i == j) {
break;
}
a [i] = a [i] + a [j];
a [j] = a [i] - a [j];
a [i] = a [i] - a [j];
if (a [i] == a [j]) {
j--;
}
}
QuickSort (a, left, i);
QuickSort (a, i + 1, right);
}
}
#endregion
public static void Main (string[] args)
{
int[] myArray = new int[]{ 53, 36, 18, 72, 20, 47, 56, 80 };
//Sort (myArray, 0, myArray.Length - 1);
QuickSortThree (myArray, 0, myArray.Length - 1);
//打印查看结果
foreach (var item in myArray) {
Console.WriteLine (item);
}
}
}
}
ps:比较懒了,直接贴代码, 有兴趣的可以参考一下 感谢这位帅哥得文章