/**
* 快速排序
*/
public class QuickSort extends AbstractSort {
/*
* 排序步骤
* 1.设定关键字,基准
* 2.划分数组
* 3.执行排序(递归按关键字,划分子数组,左边放小的,右边放大的,最终迭代完成)
*/
@Override
public void execSort(int[] arr) {
this.sort(arr, 0, arr.length - 1);
}
// 以中间项为基准
private void sort(int[] arr, int left, int right)
{
if (left >= right) return;
int middle = arr[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (arr[++i] < middle) ;
while (arr[--j] > middle) ;
if (i >= j) break;
super.swap(arr, i, j);
}
sort(arr, left, i - 1);
sort(arr, j + 1, right);
}
}
/**
* 排序测试
*/
public class MySortTest {
int[] arr = { 10, 9, 3, 1, 2, 8, -9, 4 };
AbstractSort sort;
@Before
public void before() {
System.out.println("开始排序...");
}
@After
public void after() {
System.out.println(sort.getClass().getSimpleName() + " 排序完成 !");
sort.displayAll(arr);
System.out.println();
}
@Test
public void bubbleSort() {
sort = new BubbleSort();
sort.execSort(arr);
}
@Test
public void selectionSort() {
sort = new SelectionSort();
sort.execSort(arr);
}
@Test
public void insertSort() {
sort = new InsertSort();
sort.execSort(arr);
}
@Test
public void quickSort() {
sort = new QuickSort();
sort.execSort(arr);
}
}
/**
* 排序算法抽象基类
*/
public abstract class AbstractSort {
/**
* 执行排序
*/
public abstract void execSort(int[] arr);
/**
* 交换变量
*/
protected void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/**
* 显示数组
*/
public void displayAll(int[] arr) {
System.out.println(Arrays.toString(arr));
}
}