快速排序(正向):
1.基准数(key value)是关键,选好基准数,整个算法的复杂度会下降,本例采用数组第一个数来做基准数。
2.选好key之后,就要把后面一大串数字从头尾两端开始,挨个与key比较,假设这两个参数是i和j。先移动j,当j遇到比key小的数的时候停下,i开始移动比对(i的出发点是a[0]不是a[1]),当它遇到比key值更大的数的时候停下。
3.交换a[i],a[j],这时候i、j两个参数还在刚才的位置上。
4.i、j两位继续移动,还是j先移动,重复第二、三步。
5.假如中间再没有满足i、j的条件,这时候只会有两种结果:
(1)j找不到小于key的数,最后移到了i的位置上
(2)j找到小于key的数,i找不到大于key的数,i最终会移到j的位置上
这时候a[i]=a[j]而且是一个小于key的数(这里重要了),同时a[i]的左边全是小于key的而a[i]的右边全是大于key的。
6.交换key和a[i],这时候如无意外key应该在数组的中间(反正不是最左最右,如果是也没关系)。
7.这时候数组被拆分成3块,分别是小于key、key、大于key。但是左右两块还是无序的,我们把左右两块当成新数组,重复1-6步。这也就是递规函数。
8.最后输出结果。排序完成。而倒序排序也只需要改动几个大于小于符号。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Console.WriteLine("进行max数组的快速排序:"); int[] max = new int[] { 6, 5, 2, 9, 7, 4, 0 }; int first = 0; int last = max.Length - 1; QuickSort(max, first, last); for (int i = 0; i < max.Length; i++) { Console.Write(max[i].ToString() + ","); } Console.ReadLine(); } static void QuickSort(int[] a, int left, int right) { int i, j, temp, t; if (left > right) return; temp = a[left]; i = left; j = right; while (i != j) { while (a[j] >= temp && i < j) j--; while (a[i] <= temp && i < j) i++; if (i < j) { //a[j] = a[i] + a[j]; //a[i] = a[j] - a[i]; //a[j] = a[j] - a[i]; t = a[i]; a[i] = a[j]; a[j] = t; } } a[left] = a[i]; a[i] = temp; QuickSort(a, left, i - 1); QuickSort(a, i + 1, right); } } }