接下来进行第1次循环 ,从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于 pivot,则指针向左 移动;如果小于pivot,则right指针停止移动,切换到left 指针。
在当前数列中,1<4,所以right直接停止移动,换到left指针,进行下一 步行动。
轮到left指针行动,让指针所指向的元素和基准元素做比较。如果小于 或等于 pivot,则指针向右 移动;如果大于 pivot,则left指针停止移动。
由于left开始指向的是基准元素,判断肯定相等,所以left右移1位。
由于7>4,left指针在元素7的位置停下。这时,让left和right指针所指向的元素进行交换。
接下来,进入第2次循环 ,重新切换到right指针,向左移动。right指针先移动到8,8>4,继续左移。由于2<4,停止在2的位置。按照这个思路,后续步骤如图所示。
那么快速排序怎样用代码来实现呢?
双边循环法/**
* 快速排序,双端循环
* @param arr
* @param startIndex
* @param endIndex
*/
public static void quickSort(int[] arr, int startIndex, int endIndex){
//递归结束循环条件
if(startIndex >= endIndex){
return;
}
//找到基准元素
int partitionIndex = partition(arr, startIndex, endIndex);
quickSort(arr, startIndex, partitionIndex - 1);
quickSort(arr, partitionIndex 1, endIndex);
}
/**
* 分治
* @param arr
* @param startIndex
* @param endIndex
* @return
*/
private static int partition(int[] arr, int startIndex, int endIndex) {
//取第一个位置的元素作为基准元素(也可以随机选择)
int pivot = arr[startIndex];
int left = startIndex;
int right = endIndex;
while (left != right){
//控制right 指针比较并左移
while (left < right && arr[right] > pivot){
right--;
}
//控制left指针比较并右移
while (left < right && arr[left] <= pivot){
left ;
}
//交换left和right 指针所指向的元素
if(left < right){
int p = arr[left];
arr[left] = arr[right];
arr[right] = p;
}
}
//pivot 和指针重合点交换
arr[startIndex] = arr[left];
arr[left] = pivot;
return left;
}
单边循环法
双边循环法从数组的两边交替遍历元素,虽然更加直观,但是代码实现相对烦琐。而单边循环法则简单得多,只从数组的一边对元素进行遍历和交换。我们来看一看详细过程。
给出原始数列如下,要求对其从小到大进行排序。