今天看了自己在google doc里的快速排序的代码,越看越不爽。 我想我一定是看了伪代码写出来的。如下: using System; namespace zboDo.Soring { internal class ExchangeSorting : ISortTest { private readonly int[] buffer = {5, 21, 6, 8, 9, 32, 13, 12, 41, 2, 3, 4}; #region ISortTest Members public void Sort() { //Quick Sort QuickSort(buffer, 0, buffer.Length - 1); PrintAll(); } #endregion private void PrintAll() { for (int i = 0; i < buffer.Length; i++) { Console.Write(buffer[i] + ", "); } } private void QuickSort(int[] numbers, int left, int right) { if (left < right) { int middle = numbers[(left + right)/2]; int i; int j; while (true) { i = left - 1; j= right + 1; while (numbers[++i] < middle); while (numbers[--j] > middle) ; if (i >= j) break; Swap(numbers, i, j); } QuickSort(numbers, left, i - 1); QuickSort(numbers, j + 1, right); } } private static void Swap(int[] numbers, int i, int j) { int number = numbers[i]; numbers[i] = numbers[j]; numbers[j] = number; } } } 尤其是那连续的几个While,觉得很晦涩。所以今天改写了一下,提出了几个方法。 感觉好理解多了。 using System; using System.Collections.Generic; using System.Text; namespace ACM { public class QuickSort { private readonly int[] buffer = { 5, 21, 6, 8, 9, 32, 13, 12, 41, 2, 3, 4 }; public void Run() { QS(buffer, 0, buffer.Length - 1); this.PrintAll(); } private void QS(int[] numbers, int left, int right) { if (left < right) { int middle = (left + right) / 2; int leftSentry = left; int rightSentry = right; while (leftSentry < middle || rightSentry > middle) { leftSentry = left; rightSentry = right; leftSentry = FindBigNumberFromLeft(leftSentry, middle); rightSentry = FindSmallNumberFromRight(rightSentry, middle); Swap(buffer, leftSentry, rightSentry); } QS(buffer,left, middle); QS(buffer, middle+1, right); } } private int FindSmallNumberFromRight(int rightSentry, int middle) { while (rightSentry > middle) { if (buffer[rightSentry] < buffer[middle]) break; rightSentry--; } return rightSentry; } private int FindBigNumberFromLeft(int leftSentry,int middle) { while (leftSentry < middle) { if (buffer[leftSentry] > buffer[middle]) break; leftSentry++; } return leftSentry; } private void PrintAll() { for (int i = 0; i < buffer.Length; i++) { Console.Write(buffer[i] + ", "); } } private static void Swap(int[] numbers, int i, int j) { int number = numbers[i]; numbers[i] = numbers[j]; numbers[j] = number; } } }