排序算法-快速排序

这个可以说是必须知道的排序了吧,快速排序与后面要说的二叉查找树 有相似之处(二分法)

将两个指针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         }

 

posted @ 2017-08-14 23:13  小小鱼、  阅读(201)  评论(0编辑  收藏  举报