package testSort;
/**
* 快速排序算法思想:分区比较排序
* 快速排序的执行时间与数据序列的初始排序以及基准值的选取有关。
* 最好的情况:每趟排序将序列分成长度相近的两个子序列,比较次数为O(nlog2n),时间复杂度为O(nlog2n)。
* 最坏的情况:每趟将序列分成长度差异很大的两个子序列,时间复杂度为O(n2)。
* 选取一个基值,一般选择第一个为基值
* @author 2萌
*
*/
public class QuickSort {
public int partation(int[] array, int low, int high) {
int pivot = array[low];
while(low<high) {
while(low<high&&pivot<array[high]) {
high--;
}
array[low] = array[high];
while(low<high&&pivot>array[low]) {
low++;
}
array[high] = array[low];
}
array[low] = pivot;
return low;
}
public void quickSort(int[] array, int low, int high) {
if(low<high) {
//分治排序都会获得一个新的基值
int pivot = partation(array,low,high);
//当前位置即为基准值的最终位置,所以以基准值的位置值划分为两个子序列
quickSort(array,low,pivot-1);
quickSort(array,pivot+1,high);
}
}
}
快速排序是不稳定的。
测试用例:
<pre name="code" class="java">package testSort;
public class Test {
@org.junit.Test
public void testQuickSort() {
int[] array = {49,26,97,19,66,8,52};
QuickSort q = new QuickSort();
q.quickSort(array,0,array.length-1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}