1.原理
基本思想
通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可对这两部分继续进行排序,以达到整个序列有序。
具体实现
选定一个中间数做为参考,所有元素与之比较,小的调到其左边,大的调到其右边。
(枢轴)中间数
可以是第一个数,最后一个数,最中间一个数、任选一个数等。(我这里选择第一个数也就是最左边的数作为枢轴)
2.快速排序算法分析
空间复杂度
由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度。
在平均情况下:需要O(logn)的栈空间
最坏情况下:栈空间可达O(n)
时间复杂度
划分元素的选取是影响时间性的关键。输入数据次序越乱。所选划分元素的随机性越好,排序速度越快,快速排序不是自然排序的方法。改变划分元素 的选取方法,至多只能改变算法平均情况下的性能,无法改变最坏情况下的时间性能,即最坏情况下,快速排序的时间复杂度总是O(n^2)
3.代码实现
public class quickSort {
public static void quickSort(int[] array) {
quickSortInternal(array, 0, array.length - 1);
}
private static void quickSortInternal(int[] array, int left, int right) {
if (left == right) {
return;
}
if (left > right) {
return;
}
int pivotIndex = partition(array, left, right);
quickSortInternal(array, left, pivotIndex - 1);
quickSortInternal(array, pivotIndex + 1, right);
}
private static int partition(int[] array, int left, int right){
int i = left;
int j = right;
int pivot = array[left];
while(i < j){
while(i < j && array[j] >= pivot){
j--;
}
while((i < j) && (array[i] <= pivot)){
i++;
}
swap(array, i, j);
}
swap(array, i, left);
return i;
}
private static void swap(int[] array, int a, int b){
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
public static void main(String[] args){
int[] array = {5,4,9,7,24,5,49,10};
quickSortInternal(array, 0, array.length - 1);
for(int i = 0; i <= array.length - 1; i++){
System.out.print(array[i]+" ");
}
}
}