快速排序法简单明了

来源:互联网 发布:用友软件 t系列 编辑:程序博客网 时间:2024/06/05 17:42
package JavaSEDay22;


import java.util.Arrays;


/*
arr[] 20, 10, 25, 5, 15, 30, 8, 20, 12

i    0   1   2   3   4   5   6   7   8
 
    i         p                  j
*/

public class Quick {

//自定义成员方法实现快速排序算法,将参数指定数组中的所有元素从小到大依次排列


public static void quick(int[] arr, int left, int right){

//1.计算中间元素的下标,并以该元素作为基准值单独保存


int p = (left + right)/2; //无论偶数奇数都是取整数

int pivot = arr[p];


//2.分别使用左右两边的元素依次与基准值比较大小,将所有比基准值小的元素放在

//  左边,将所有比基准值大或者相等的元素放在右边

int i = left; 

int j = right;


while( i < j){
//先使用左边的元素与基准值比较,若左边的元素小于基准值并且确实在左边,则
//使用下一个左边的元素继续与基准值比较大小
while(arr[i]<pivot && i<p){

i++;

}


//直到左边有元素并且左边元素不再小于基准值,此时将左边元素移动到p指向的
//位置,p指向该元素原来的位置
if(i < p){
arr[p] = arr[i]; // arr[p]=arr[i]=20
p = i;
// p = i =0

}


//当右边的元素大于等于基准值并且确实在右边时,使用下一个右边的元素去比较
while(pivot<=arr[j] && p<j){
j--;

}


//直到右边有元素但不再大于等于基准值时,则将右边元素移动到p指向的位置
//p指向该元素原来的位置
if(p < j){
arr[p] = arr[j];
p = j;
}

}


//3.直到左右两边元素的下标重合时,就将基准值放在重合的位置

arr[p] = pivot;


//4.分别对左右两边的分组进行再次分组,使用递归处理
if(p - left > 1){
quick(arr, left, p-1);
}
if(right - p > 1){
quick(arr, p+1, right);
}
}


public static void main(String[] args) {

int[] brr = {20, 10, 25, 5, 15, 30, 8, 20, 12};

Arrays.sort(brr);


//打印排序后的结果
System.out.print("排序后的结果是:");
for(int i = 0; i < brr.length; i++){
System.out.print(brr[i] + " ");
}
System.out.println();
}

}


希望能对大家理解快速排序有所帮助。