using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sort
{
class QuickSorter
{
private static int[] myArray;
private static int arraySize;
public static int[] Sort(int[] a)
{
arraySize = a.Length;
QuickSort(a, 0,arraySize- 1);return a;
}
private static void QuickSort(int[] myArray, int left, int right)
{
int i, j, s;
if (left < right)
{
i = left - 1;
j = right + 1;
s = myArray[(i + j) / 2];
while (true)
{
while (myArray[++i] < s) ;
while (myArray[--j] > s) ;
if (i >= j)
break;
Swap(ref myArray[i], ref myArray[j]);
}
QuickSort(myArray, left, i - 1);
QuickSort(myArray, j + 1, right);
}
}
private static void Swap(ref int left, ref int right)
{
int temp;
temp = left;
left = right;
right = temp;
}
}
}
以一個數組作為示例,取區間第一個數為基准數。
0
1
2
3
4
5
6
7
8
9
72
6
57
88
60
42
83
73
48
85
初始時,i = 0; j = 9; X = a[i] = 72
由於已經將a[0]中的數保存到X中,可以理解成在數組a[0]上挖了個坑,可以將其它數據填充到這來。
從j開始向前找一個比X小或等於X的數。當j=8,符合條件,將a[8]挖出再填到上一個坑a[0]中。a[0]=a[8]; i++; 這樣一個坑a[0]就被搞定了,但又形成了一個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。這次從i開始向後找一個大於X的數,當i=3,符合條件,將a[3]挖出再填到上一個坑中a[8]=a[3]; j--;
數組變為:
0
1
2
3
4
5
6
7
8
9
48
6
57
88
60
42
83
73
88
85
i = 3; j = 7; X=72
再重復上面的步驟,先從後向前找,再從前向後找。
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上一個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出。
此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將X填入a[5]。
數組變為:
0
1
2
3
4
5
6
7
8
9
48
6
57
42
60
72
83
73
88
85
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重復上述步驟就可以了。