一、什么是快速排序
快速排序采用分治法的思路,对数组排序时每一轮挑选一个基准元素,然后将比基准元素大的移到数组的右边,比基准元素小的移到数组的左边,从而将数组一分为二,然后对一分为二的两部分再分别采用前面的思路,一直到整个数组有序。
二、递归实现快速排序
快速排序算法既可以使用递归的方式实现,也可以使用非递归的方式实现。由上面的定义可知,快速排序实现主要在于元素位置的交换,对于元素位置的交换有两种方法,一种是双边循环法,另一种是单边循环法。
1、双边循环法
首先选定基准元素pivot,然后设置两个指针left和right,分别指向数列的最左和最右两个元素。如下所示:
实现步骤:
- 从right指针开始,用right指针指向的元素与基准元素进行比较,如果大于等于pivot,则right指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针;
- 用left指针指向的元素与基准元素作比较,如果小于等于pivot,则指针向右移动;如果大于pivot,则指针停止移动;
- 让left和right指针所指向的元素进行交换。
- 重复以上步骤,直到left=right。
具体的代码实现:
/**
* 递归实现快速排序
* @param arr 待排序的数组
* @param startIndex 数组的起始下标
* @param endIndex 数组的结束下标
*/
public static void quickSort(int[] arr,int startIndex,int endIndex){
//递归结束条件:startIndex大于或等于endIndex
if(startIndex>=endIndex){
return;
}
//得到基准元素位置
int pivotIndex=partition(arr,startIndex,endIndex);
//根据基准元素,分成两部分进行递归排序
quickSort(arr,startIndex,pivotIndex-1);
quickSort(arr,pivotIndex+1,endIndex);
}
/**
* 分治(双边循环法)
* @param array 待交换的数组
* @param startIndex 开始下标
* @param endIndex 结束下标
* @return
*/
private static int partition(int[] array, int startIndex, int endIndex) {
//取第1个位置(也可以选择随机位置)的元素作为基准元素
int pivot=array[startIndex];
int left=startIndex;
int right=endIndex;
while (left!=right){
//控制right指针比较并左移
while (left<right&&array[right]>pivot){
right--;
}
//控制left指针比较并右移
while (left<ri