彻底搞懂快速排序法
基本介绍
使小于选定基准的数据在左边,大于的在右边,而后分而治之。
——爱因斯坦
核心思想
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实例讲解
主要思路
- 当左侧下标小于右侧下标时,将基准元素放置到对应位置(使得其左侧值均小于等于它,右侧值均大于等于它),然后递归的快速排序基准值左侧的子数组和右侧的子数组;
- 如何将基准值放置到对应位置?默认基准值为最左侧元素,首先从右侧开始遍历,如果右侧值大于等于基准值那么将右侧指针左移,直到满足右侧元素小于基准值时将其赋值给左指针位置;然后比较左侧元素与基准值的大小,如果左侧元素小于等于基准值则右移指针,直到左侧元素大于基准值,将其赋值给右侧指针位置;最终左侧指针位置与右侧位置指针重合时将基准值赋值过来即可。
- 具体结合代码实现消化
图示演示
将基准值放置到对应位置图示
快速排序整体过程图示
代码实现
Talk is cheap, show me the code.
import java.io.*;
import java.util.*;
// Author:Peiliang Gong
// quickSort.
class Sort
{
//main function
public static void main (String[] args) throws java.lang.Exception
{
int[] arr = {3,-1,56,0,0,0,7,-3,2,-4};
quickSort(arr, 0, arr.length-1);
System.out.println("排序后的结果为:"+Arrays.toString(arr));
}
private static void quickSort(int[] arr, int left, int right) {
if(left < right){
int partition = partition(arr, left, right);
quickSort(arr, left, partition-1);
quickSort(arr, partition+1, right);
}
}
//一次划分,将基准点放置在对应的位置并返回位置索引
public static int partition(int[] arr, int left, int right){
int pivot = arr[left];
while(left < right){
while(left < right && arr[right] >= pivot){
right--;
}
arr[left] = arr[right];
while(left < right && arr[left] <= pivot){
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
}