最近面试的时候,被问到了快速排序法。一时之间,无法想起算法来。
重新看了书本,算法如下:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值a[j],并与key交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的a[i],与key交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)
C#代码:
void QSort<T>(T[] array)where T :IComparable { QuackSort<T>(array, 0, array.Length-1); } void QuackSort<T>(T[] array,int left,int right)where T:IComparable { if (left < right) { int middle = Partition<T>(array, left, right); QuackSort<T>(array, left, middle - 1); QuackSort<T>(array, middle + 1, right); } } int Partition<T>(T[] array, int left, int right)where T:IComparable { T key = array[left]; while (left<right) { while (left < right && key.CompareTo(array[right]) < 0) { right--; } if (left < right) { T temp = array[left]; array[left] = array[right]; array[right] = temp; left++; } while (left < right && key.CompareTo(array[left]) > 0) { left++; } if (left < right) { T temp = array[left]; array[left] = array[right]; array[right] = temp; right--; } array[left] = key; } return left; }
调用如下:
static void Main(string[] args) { int[] array = new int[]{ 49, 38, 65, 97, 76, 13, 27 }; Program program = new Program(); program.QSort<int>(array); foreach (var item in array) { Console.WriteLine(item); } Console.ReadLine(); }