前言
快速排序在处理大量数据的排序时,效率是很高的。
体现分治法中“合”的部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xCfmRqQU-1584517187321)(在这里插入图片描述)]](https://img-blog.csdnimg.cn/20200318153938309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzOTE0Mzc0,size_16,color_FFFFFF,t_70)
代码
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] data = {7, 2, 9, 4, 3, 8, 6, 1};
System.out.println("排序之前:" + Arrays.toString(data));
//Arrays.toString(data)方法输出这个串数
QuickSort(data);
System.out.println("排序之后:" + Arrays.toString(data));
}
public static void QuickSort(int[] data) {
sort(data, 0, data.length-1 );
}
public static void sort(int[] data, int left, int right) {
if(left<right){
int q = Partition(data, left, right);
sort(data, left, q);
sort(data, q + 1, right);}
}
public static int Partition(int[] data, int p, int r) {
int i = p, j = r + 1;
int x = data[p];
while (true) {
while (data[++i] < x)
while (data[--j] > x)
if (i < j) {
swap(data,i, j);
} else {
break;
}
}
data[p] = data[j];
data[j] = x;
return j;
}
public static void swap(int[]data,int i, int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
运行结果
补充:
陷阱
while (true) {
while (data[++i] < x)
while (data[--j] > x)
是先加减在在比较,如果些写成i++,或j--就会导致数组越界。
优化
由于选择第一个数作为中间比较数,若数据排序之前就是按顺序排列的,每次都会进行一次排序。
例如:
1.2.3.4.5.6
第一次选择1,经过比大小,没有小于1的。又在大于1的数据里面就又要重新选择2,在与2进行比大小。使得比较次数与排序次数变得比较大。
因此可以找一个新的选择方法,来找这个数。random(l,r)。
这个方法可以是,找到位于数列最左边与最右边和中间的3个数,找出3个中位于中间大小的那个数,作为比较数。可以很好的避免最坏情况的出现。
快速排序是不稳定排序
时间复杂度O (nlogn)