`
thingkau
  • 浏览: 72550 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

排序【快速排序】

阅读更多
快速排序:
设定一个枢纽的值,一般以首个元素的值为枢纽的值,把比枢纽小的元元素放在左边,比枢纽值大的元素放在右边,最后把枢纽的值放到合适的位置。根据返回枢纽的位置,对以上过程进行递归。

/**
 * EnhancedQuickSort.java
 * 
 * 快速排序
 * 
 * @author Administrator
 */

public class QuickSort {

	public static void quickSort(int[] a) {

		qSort(a, 0, a.length - 1);

	}

	/**
	 * 对下标从s到t的元素进行快速排序。
	 */
	public static void qSort(int[] a, int s, int t) {

		if (s < t) {

			int pivot = partition(a, s, t);

			qSort(a, s, pivot - 1);
			qSort(a, pivot + 1, t);

		}
	}

	/**
	 * 该方法返回枢纽的下标。
	 */
	public static int partition(int[] a, int p, int r) {

		int i = p, j = r + 1;

		int x = a[p];

		/**
		 * 将 >= x的元素交换到右边区域,<= x的元素交换到左边区域。
		 */

		while (true) {

			while (a[++i] < x) {
				if (i >= r)
					break;
			}
			while (a[--j] > x)
				;

			if (i >= j)
				break;

			Util.swap(a, i, j);
		}

		a[p] = a[j];
		a[j] = x;

		return j;
	}

	public static void main(String[] args) throws Exception {

		if (args.length == 0) {
			System.out.println("请输入数字以空格隔开");
			System.exit(-1);
		}

		int[] a = new int[args.length];

		for (int i = 0; i < args.length; i++)

			a[i] = Integer.parseInt(args[i]);

		// int[] a = new int[100];
		// for(int i = 0; i < a.length; i++)a[i] = 100-i;

		quickSort(a);

		// 输出排序后的数组元素。
		for (int i = 0; i < a.length; i++)
			System.out.println(a[i]);

	}

}



改进型:随机枢纽快速排序RadomQuickSort.java
/**
 * RadomQuickSort.java
 * 
 * 随机枢纽快速排序.每次都随机选择无序序列中的一个数为枢纽的值.
 * 
 * @author Administrator
 * 
 */
public class RadomQuickSort {

	public static int radomPartition(int[] a, int p, int r) {

		// 生成p到r之间的一个随机数j
		int j = (int) Math.round(Math.random() * (r - p)) + p;
		Util.swap(a, p, j);

		return QuickSort.partition(a, p, r);

	}

	public static void rQSort(int[] a, int s, int t) {

		if (s < t) {

			int pivot = radomPartition(a, s, t);

			rQSort(a, s, pivot - 1);
			rQSort(a, pivot + 1, t);

		}

	}

	public static void radomQuickSort(int[] a) {

		rQSort(a, 0, a.length - 1);

	}

	public static void main(String[] args) throws Exception {

		if (args.length == 0) {
			System.out.println("请输入数字以空格隔开");
			System.exit(-1);
		}

		int[] a = new int[args.length];

		for (int i = 0; i < args.length; i++)

			a[i] = Integer.parseInt(args[i]);

		radomQuickSort(a);

		// 输出排序后的数组元素。
		for (int i = 0; i < a.length; i++)
			System.out.println(a[i]);

	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics