public class QuickSort {
/***
* 快排
* 一个数组int []arr,取第一个元素的值,赋值给temp=arr[0],做临时基准数(该temp仅做对比用)
* 1.左右两头一起向中间比较,找到右边第一个比temp小的数和再找到左边第一个比temp大的数,将这两个数在arr中交换位置
* 2.循环上一过程,直到左边数的下标idx_left和右边下标idx_right相等,或者左边大于右边下标. while(idx_left<idx_right) 证明全部都调换过了,本次循环停止,结果为:大于temp的都过去相交坐标右边,小与temp的都去相交坐标左边了
* 3.将arr[交点坐标]与arr[0]互换,得到数组情况: 小与temp的数+temp+大于temp的数
* 4.递归排序:起点arr[0],终点arr[交点坐标]左侧数组进行该排序,起点arr[交点坐标],终点arr[arr.length]右侧数组进行排序
* 5.一直递归调用,直到最下级递归中不满足while(idx_left<idx_right),递归停止
* 6.排序完成
* @param arr
* @param left
* @param reght
*/
public static void quickSort(int[] arr,int left,int reght){
int i,j,temp,t;
if(left>reght){
return;
}
i=left;
j=reght;
temp = arr[left];//temp就是基准位
while (i<j) {//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {//不满足该元素小于temp,则j--,继续对比向左下一个数
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {//不满足该元素大于temp,则i++,继续对比向右下一个数
i++;
}
//上述循环跳出,证明得到的arr[j]<temp,arr[i]>temp,则:
if (i<j) {//证明此时i依然是j的左边
t = arr[j];//交换arr[i]和arr[j]的值
arr[j] = arr[i];
arr[i] = t;
}//else,若不满足i<j,说明temp左边的数都比temp小,右边的都比temp大了
}
//最后将基准为与i和j相等位置的数字交换
arr[left] = arr[i];
arr[i] = temp;
//递归调用左半数组,起始位置为最左,终点为i,j交点
quickSort(arr, left, j-1);
//递归调用右半数组,起始位为j,i交点,终点为最右
quickSort(arr, j+1, reght);
}
public static void main(String[] args){
int[] arr = {22,31,1,223,29,92,82,95,9,11,22,35,54};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(",");
}
}
}
快速排序,快排
最新推荐文章于 2022-11-15 17:19:43 发布