快排

空扰寡人 提交于 2019-11-28 23:39:21

先讲经典快排。

数组最后一个值是 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));
	}

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!