八大排序之快速排序
快速排序的思想:
快速排序是属于交换类型排序,采用不断的移动和比较来进行排序,快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。
快速排序动画网址:https://visualgo.net/zh/sorting
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
从数列中挑出一个元素,称为"基准"(pivot)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
实现代码:
public class QuickSort {
public static void main(String[] args) {
int []arr = new int[]{2,6,4,6,1,0,9,5,7,2,3,0};
System.out.println(Arrays.toString(arr));
quickSort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
//快速排序,使用递归,参数为 指定数组,开始的位置,以及结束的位置。 用start指向的数作为基准数,然后其他元素和基准数比较,
public static void quickSort(int []arr,int start,int end){
//递归终止条件
if(start < end){
//只有start指针和end指针重合时停止比较
//记录基准数以及需要排序的下标
int stand = arr[start];
int low = start;
int high = end;
while (low < high){
//如果end指针指的数比基准数大 , high指针就往前移动,不需要交换数据
while (low < high && stand <= arr[high]) {
high -- ;
}
//如果比基准数小 ,将High指针指向的数复制到low指针,此时low指针指向的数是比基准数小的,所以就会执行下一步,low指针往前移
arr[low] = arr[high];
//low指针指向的数比基准数小 ,low指针前移
while (low < high && stand >= arr[low]){
low ++;
}
//否则将low指针指向的数复制到high指针上,此时high指针的数又比基准数小,又会执行第一步
arr[high] = arr[low];
}
arr[low] = stand;
quickSort(arr,start,low);
quickSort(arr,low+1,end);
}
}
}
就是先选中一个基准数,先把比基准数小的移到基准数前面,比基准数的往后挪,不断的递归