快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为 "基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
c#代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
public
static
void
Sort(
int
[] numbers)
2 {
3 Sort(numbers, 0 , numbers.Length - 1 );
4 }
5
6 private static void Sort( int [] numbers, int left, int right)
7 {
8 if (left < right)
9 {
10 int middle = numbers[(left + right) / 2 ];
11 int i = left - 1 ;
12 int j = right + 1 ;
13 while ( true )
14 {
15 while (numbers[ ++ i] < middle) ;
16
17 while (numbers[ -- j] > middle) ;
18
19 if (i >= j)
20 break ;
21
22 Swap(numbers, i, j);
23 }
24
25 Sort(numbers, left, i - 1 );
26 Sort(numbers, j + 1 , right);
27 }
28 }
29
30 private static void Swap( int [] numbers, int i, int j)
31 {
32 int number = numbers[i];
33 numbers[i] = numbers[j];
34 numbers[j] = number;
35 }
2 {
3 Sort(numbers, 0 , numbers.Length - 1 );
4 }
5
6 private static void Sort( int [] numbers, int left, int right)
7 {
8 if (left < right)
9 {
10 int middle = numbers[(left + right) / 2 ];
11 int i = left - 1 ;
12 int j = right + 1 ;
13 while ( true )
14 {
15 while (numbers[ ++ i] < middle) ;
16
17 while (numbers[ -- j] > middle) ;
18
19 if (i >= j)
20 break ;
21
22 Swap(numbers, i, j);
23 }
24
25 Sort(numbers, left, i - 1 );
26 Sort(numbers, j + 1 , right);
27 }
28 }
29
30 private static void Swap( int [] numbers, int i, int j)
31 {
32 int number = numbers[i];
33 numbers[i] = numbers[j];
34 numbers[j] = number;
35 }
参考:算法总结