您的位置:首页 > 其它

快排

2019-08-30 18:28 1921 查看

先讲经典快排。

数组最后一个值是 X (划分值)

争取<= X 的值放在左边,>= X 的放在右边。

开始一个数组,最后一个值作为划分值。

然后整个数组分为两个部分,<=X 的在左边,>=X 的在右边。

然后<=X 的当做一个全新的数组,再次把最后一个值当做划分值。两个部分拆分下去,让整个部分都有序。以上是经典快排。

改进:

=x 的部分不动,小于X 的区域和大于 X 的区域继续这样的过程——递归。

package suanfa;

public class quickSort {

public static void quicksort(int[] arr) {   //重载
if (arr == null || arr.length < 2) {
return;
}
quicksort(arr, 0, arr.length - 1);
}

public static void quicksort(int[] arr, int L, int R) {
if (L < R) { // 临界条件
//swap(arr,L+(int)(Math.random()*(R-L+1)),R);   这时一个随机快排
int[] p = partition(arr, L, R);   //经过一个p过程,返回一个数组,是等于区域的左右两个边界
quicksort(arr, L, p[0] - 1); // 左边部分继续递归
quicksort(arr, p[1] + 1, R); // 右边部分继续递归
}
}

public static int[] partition(int[] arr, int L, int R) {
int less = L - 1; // less 是小于区域的
int more = R; // more是 大于区域的

while (L < more) {   //循环条件,只要左边界<右边界,循环下去
if (arr[L] < arr[R]) {
swap(arr, ++less, L++);
} else if (arr[L] > arr[R]) {
swap(arr, --more, L);
} else {
L++;
}
}
swap(arr, more, R);  //边界代码一开始没有参与,最后要归位
return new int[] { less + 1, more };   //返回一个数组
}

public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;

}

public static void main(String[] args) {
int[] arr = { 0, 1, -94, 65, 888 };
System.out.println(java.util.Arrays.toString(arr));
quicksort(arr);
System.out.println(java.util.Arrays.toString(arr));
}

}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: