快速排序的基本思想:通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另外一部分数据小。然后使用递归进行操作。
这里采用三平均分区法,即不是选择第一个元素作为中轴,而是选用待排序的最左边的元素,中间的元素和最右边的元素这三个元素中的中间值作为中轴。这样可以避免,本来这个序列是有序的,按照相反的顺序进行排序时,效率最低这种情况。并且防止数组越界。
/**
* 对开始索引和结束索引进行排序
* @param a 原始数组
* @param left 开始索引
* @param right 结束索引
*/
private static void quickSort(int[] a, int left, int right){
if(left >= right){
return;
}
int pivot = midian(a,left,right);
int i = left, j = right - 1;
if(i != j){
for(;;){
while(a[++i] < pivot) {}
while(a[--j] > pivot) {}
if(i < j)
swap(a,i,j);
else
break;
}
swap(a, i, right-1);
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
}
/**
* 找出中间值,放在倒数第二个位置上,因为a[center]<=a[right]
* @param a
* @param left
* @param right
* @return
*/
private static int midian(int[] a, int left, int right){
int center = (left + right) / 2;
if(a[center] < a[left])
swap(a, left, center);
if(a[right] < a[left])
swap(a, left, right);
if(a[right] < a[center])
swap(a, center, right);
swap(a, center, right-1);
return a[right-1];
}
/**
* 进行交换
* @param array 原始数组
* @param i
* @param j
*/
private static void swap(int[] array,int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
时间复杂度:平均情况O(nlogn),最坏O(n^2)