排序算法-快速排序
这个可以说是必须知道的排序了吧,快速排序与后面要说的二叉查找树 有相似之处(二分法)
将两个指针i,j分别指向表的起始和最后的位置。
选定一个基准(可以选取集合第一位)
反复操作以下两步:
(1)j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。
(2)i逐渐增大,并逐次比较i指向的元素和目标元素的大小,若p(i)>T则交换位置。
直到i,j指向同一个值,循环结束。
此时基准左边都比自己小,右边都比自己大(2边都可能一样大)
此时按照基准分为左右2边,不包含基准,如果超过2为元素,则迭代,重复上面操作
代码:
1 public static void QKSort(int[] array, int left = -1, int right = -1) 2 { 3 int i = left == -1 ? 0 : left; 4 int j = right == -1 ? array.Length - 1 : right; 5 //选取基准 6 int k = i; 7 8 while (i < j) 9 { 10 //从后面往前面检查是否存在大于基准的元素 11 while (j >= i) 12 { 13 if (array[j] < array[k]) 14 { 15 int c = array[j]; 16 array[j] = array[k]; 17 array[k] = c; 18 k = j; 19 j--; 20 break; 21 } 22 j--; 23 } 24 25 //从前面往后检查是否存在小于基准的数 26 while (i <= j) 27 { 28 if (array[i] > array[k]) 29 { 30 int c = array[i]; 31 array[i] = array[k]; 32 array[k] = c; 33 k = i; 34 i++; 35 break; 36 } 37 i++; 38 } 39 } 40 41 //基准左右元素如果超过2位则迭代继续 42 if (k - left >= 2) 43 { 44 //左边还有 45 QKSort(array, left, k - 1); 46 } 47 if (right - k >= 2) 48 { 49 //右边还有 50 QKSort(array, k + 1, array.Length - 1); 51 } 52 }