快速排序
快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的数据比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此使整个数据变成有序序列。
实现方法:快速排序会先把数组中的一个数当作基准数(参照数),一般会把数组中最左边的数当作基准数。然后从两边进行查找,先从右边开始查找比基准数小的,再从左边查找比基准数大的(如果选择最右边的数为基准数那么就先从左边检索,方法类似。),如果找到了就停下,然后交换这两个元素,然后在进行查找。直到两个数相遇,那个此时将基准值与相遇位置元素进行交换,此时基准值左边的所有数据全部比基准值小,右边所有数据全部比基准值大。然后将基准数左边和基准数右边的数组分别采用上述同样的方法进行排序,可以采用递归进行,直到整个数据变成有序序列。
后面,然后将基准数左边和基准数右边的数组分别采用上述同样的方法,可以采用递归进行,直到整个数据变成有序序列。
代码如下:
public class quicksort {
public static void main(String[] args) {
int []arr={7,2,3,8,10,4,5,6,11,9};
//调用方法,进行快速排序
quicksort(arr, 0, arr.length -1);
//遍历数组输出
for(int i=0;i<arr .length;i++){
System.out.print(arr [i]+" ,");
}
};
/*
*定义方法
*/
public static void quicksort(int []arr,int left,int right) {
//进行判断,如果左边索引比右边大,那么直接return结束这个方法
if (left > right) {
return;
}
//定义变量,保存基准数
int base = arr[left];
//定义变量i执行最左边
int i = left;
//定义变量j只想左右边
int j = right;
while (i != j) {
//先由j从右往左检索比基准数小的,如果比基准数小的,就停下,
while (arr[j] >= base && i != j) {
j--;
}
//再从i从左向右检索比基准值大的,如果比基准数大,就停下
while (arr[i] <= base && i!=j) {
i++;
}
//代码运行到这里,i停下,j也停下,然后交换i,j位置的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//如果上面的while循环不成立,会跳出这个循环,往下执行
//也就是i,j相遇,那么就把相遇位置元素和基准数交换
arr[left]=arr[i];
//把基准数赋给相遇位置元素
arr[i]=base;
//基准数在这里归为,左边都比他小,右边都比他大
//排基准数左边
quicksort(arr, left,i-1);
//排基准数右边
quicksort(arr, i+1, right);
}
}
运行结果为
2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,
可以看出快速排序是不稳定的,另外平均时间复杂度为O(nlogn),最好情况O(nlogn),最坏情况O(N^2).在代码中j和i向前查找的条件一定得想好到底那边大,另外此排序采用递归就可以实现,不用每一步都用代码写出来。