快速排序

长风破浪会有时,直挂云帆济沧海。——李白

 

/**
 * 
 * @author Jason Li 2014-5-29 <br />
 *         快速排序, 类似于合并排序,基本思想是:<br />
 *         把待排序的元素分成两部分, 以一个主元(Pivot Element)为界,<br />
 *         主元左边元素都不大于主元,主元右边元素都不小于主元,然后对左右部分递归此过程。<br />
 * 
 *         算法的关键是分区的划分,即主元取值的选择, 这里主元是取最右边值作为主元值。
 */
public class QuickSortTest {

	public static void main(String[] args) {
		int[] dataArray = { 2, 6, 4, 9, 1, 7, 8, 3, 5 };
		QuickSort(dataArray, 0, dataArray.length - 1);
		System.out.println(Arrays.toString(dataArray));

	}

	// 快速排序
	private static void QuickSort(int[] dataArray, int startIndex, int endIndex) {
		if (startIndex < endIndex) {
			int pivotIndex = Partion(dataArray, startIndex, endIndex);
			QuickSort(dataArray, startIndex, pivotIndex - 1); // 递归主元左边部分
			QuickSort(dataArray, pivotIndex + 1, endIndex); // 递归主元右边部分
		}
	}

	// 分割待排序区域,返回主元位置,使主元左边元素都不大于主元,主元右边元素都不小于主元
	private static int Partion(int[] dataArray, int startIndex, int endIndex) {
		int pivot = dataArray[endIndex]; // 最后一个元素值为主元的值
		int smallIndex = startIndex - 1;
		for (int largeIndex = startIndex; largeIndex < endIndex; largeIndex++) {
			// 从左开始,遂个与主元值值比较,如果小则依次放到左边
			if (dataArray[largeIndex] <= pivot) {
				smallIndex++;
				swap(dataArray, smallIndex, largeIndex);
			}
		}
		swap(dataArray, smallIndex + 1, endIndex);// 主元值与第一个不小于主元的值做交换
		return smallIndex + 1;
	}

	// 两个数组元素交换
	private static void swap(int[] dataArray, int i, int j) {
		// 如果是同一元素,或存储的值一致则不用做交换
		if (i != j && dataArray[i] != dataArray[j]) {
			int temp = dataArray[i];
			dataArray[i] = dataArray[j];
			dataArray[j] = temp;
		}
	}
}

 

 

你可能感兴趣的:(java,排序,算法,快速排序)