快速排序是一种排序执行效率很高的排序算法,它利用分治法来对待排序序列进行分治排序,它的思想主要是通过一趟排序将待排记录分隔成独立的两部分,其中的一部分比关键字小,后面一部分比关键字大,然后再对这前后的两部分分别采用这种方式进行排序,通过递归的运算最终达到整个序列有序,下面我们简单进行阐述。
我们从一个数组来逐步逐步说明快速排序的方法和思路。
快速排序之所以比较快,是因为相比冒泡排序,每次的交换都是跳跃式的,每次设置一个基准值,将小于基准值的都交换到左边,大于基准值的都交换到右边,这样不会像冒泡一样每次都只交换相邻的两个数,因此比较和交换的此数都变少了,速度自然更高。当然,也有可能出现最坏的情况,就是仍可能相邻的两个数进行交换。
快速排序基于分治思想,它的时间平均复杂度很容易计算得到为O(NlogN)。
1 /**
2 * 快速排序
3 * @param array
4 */
5 public static void quickSort(int[] array) {
6 int len;
7 if(array == null
8 || (len = array.length) == 0
9 || len == 1) {
10 return ;
11 }
12 sort(array, 0, len - 1);
13 }
14
15 /**
16 * 快排核心算法,递归实现
17 * @param array
18 * @param left
19 * @param right
20 */
21 public static void sort(int[] array, int left, int right) {
22 if(left > right) {
23 return;
24 }
25 // base中存放基准数
26 int base = array[left];
27 int i = left, j = right;
28 while(i != j) {
29 // 顺序很重要,先从右边开始往左找,直到找到比base值小的数
30 while(array[j] >= base && i < j) {
31 j--;
32 }
33
34 // 再从左往右边找,直到找到比base值大的数
35 while(array[i] <= base && i < j) {
36 i++;
37 }
38
39 // 上面的循环结束表示找到了位置或者(i>=j)了,交换两个数在数组中的位置
40 if(i < j) {
41 int tmp = array[i];
42 array[i] = array[j];
43 array[j] = tmp;
44 }
45 }
46
47 // 将基准数放到中间的位置(基准数归位)
48 array[left] = array[i];
49 array[i] = base;
50
51 // 递归,继续向基准的左右两边执行和上面同样的操作
52 // i的索引处为上面已确定好的基准值的位置,无需再处理
53 sort(array, left, i - 1);
54 sort(array, i + 1, right);
55 }
欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
留言与评论(共有 0 条评论) |