Java 快速排序算法

/**
 * 改进后的快速排序:
 * 
 */
public class ImprovedQuickSort {

	private static int MAX_STACK_SIZE = 4096;
	private static int THRESHOLD = 10;

	public void sort(int[] data) {
		int[] stack = new int[MAX_STACK_SIZE];

		int top = -1;
		int pivot;
		int pivotIndex, l, r;

		stack[++top] = 0;
		stack[++top] = data.length - 1;

		while (top > 0) {
			int j = stack[top--];
			int i = stack[top--];

			pivotIndex = (i + j) / 2;
			pivot = data[pivotIndex];

			swap(data, pivotIndex, j);

			// partition
			l = i - 1;
			r = j;
			do {
				while (data[++l] < pivot)
					;
				while ((r != 0) && (data[--r] > pivot))
					;
				swap(data, l, r);
			} while (l < r);
			swap(data, l, r);
			swap(data, l, j);

			if ((l - i) > THRESHOLD) {
				stack[++top] = i;
				stack[++top] = l - 1;
			}
			if ((j - l) > THRESHOLD) {
				stack[++top] = l + 1;
				stack[++top] = j;
			}

		}
		// new InsertSort().sort(data);
		insertSort(data);
	}

	/**
	 * @param data
	 */
	private void insertSort(int[] data) {
		for (int i = 1; i < data.length; i++) {
			for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
				swap(data, j, j - 1);
			}
		}
	}

	private void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

}



/**
 * 快速排序:
 * 
 */
public class QuickSort {

	public void sort(int[] data) {
		quickSort(data, 0, data.length - 1);
	}

	private void quickSort(int[] data, int i, int j) {
		int pivotIndex = (i + j) / 2;
		// swap
		swap(data, pivotIndex, j);

		int k = partition(data, i - 1, j, data[j]);
		swap(data, k, j);
		if ((k - i) > 1)
			quickSort(data, i, k - 1);
		if ((j - k) > 1)
			quickSort(data, k + 1, j);

	}

	/**
	 * @param data
	 * @param l
	 * @param r
	 * @param pivot
	 * @return
	 */
	private int partition(int[] data, int l, int r, int pivot) {
		do {
			while (data[++l] < pivot)
				;
			while ((r != 0) && data[--r] > pivot)
				;
			swap(data, l, r);
		} while (l < r);
		swap(data, l, r);
		return l;
	}

	private void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

}

你可能感兴趣的:(java,算法,J#)