排序算法之快速排序

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

package quick_sort;

import org.junit.Before;
import org.junit.Test;

public class QuickSort {

	private int[] data;
	
	@Before
	public void before() {
		data = new int[] {65, 79, 10, 54, 71, 97, 50};
	}
	
	@Test
	public void test_sort() {
		print();
		quickSort(data, 0, data.length - 1);
	}
	
	public void quickSort(int[] array, int left, int right) {
		int ltemp = left;
		int rtemp = right;
		int border = array[(left + right) / 2];
		
		int temp;
		while (ltemp < rtemp) {
			while (array[ltemp] < border) {
				++ltemp;
			}
			while (array[rtemp] > border) {
				--rtemp;
			}
			if (ltemp < rtemp) {
				temp = array[ltemp];
				array[ltemp] = array[rtemp];
				array[rtemp] = temp;
				ltemp++;
				rtemp--;
				print();
			}
			if (ltemp == rtemp) {
				ltemp++;
			}
			if (left < rtemp) {
				quickSort(array, left, rtemp);
			}
			if (right > ltemp) {
				quickSort(array, rtemp, right);
			}
		}
		
	}
	
	protected void print() {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i]);
			if (i != data.length - 1) {
				System.out.print(", ");
			}
		}
		System.out.println();
	}
	
	
}

控制台输出了排序的过程:

65, 79, 10, 54, 71, 97, 50
50, 79, 10, 54, 71, 97, 65
10, 79, 50, 54, 71, 97, 65
10, 54, 50, 79, 71, 97, 65
10, 50, 54, 79, 71, 97, 65
10, 50, 54, 71, 79, 97, 65
10, 50, 54, 71, 79, 65, 97
10, 50, 54, 71, 65, 79, 97
10, 50, 54, 65, 71, 79, 97

附:坐在马桶上看算法:快速排序

点赞