参考自漫画算法,侵删!!!
(1)选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右边两个元素。
(2)接下来进行第一次循环,从right指针开始,让指针所指向元素和基准元素做比较。如果大于或者等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。
(3)left指针移动时,让指针所指向的元素和基准元素作比较。如果小于或等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。
(4)直到left指针和right指针重合,将基准元素pivot与指针重合处所指向内容交换。第一轮交换结束。具体代码如下所示
package com.company;
import java.lang.reflect.Array;
import java.util.Arrays;
public class quickSort {
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, endIndex-1);
quickSort(arr, startIndex, endIndex-1);
/**
* 分治(双边循环法)
* @param arr 待交换的数组
* @param startIndex 起始下标
* @param endIndex 结束下标
*/
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;
}
public static void main(String[] args){
int[] arr=new int[] {4,4,6,5,3,2,8,1};
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
}