快速排序
-
快排可以理解为冒泡排序的改进,也是不断的比较和移动,只不过移动的间隔变大了
-
时间复杂度为O(N * logn),可以通过递归排序树来理解
-
主要思想:
(1)随机选取一个基准,通过排序使该基准左边的数都小于等于基准数,右边的数都大于等于这个基准数
(2)在数组的两头设置两个哨兵,保证左哨兵的索引小于右哨兵,左哨兵向右移动遇到比基准值小的停下,右哨兵向左移动,遇到比基准值小的停下,交换两哨兵索引处的值。
(3)当第一趟排序完成之后,对基准值两侧的子序列继续进行排序。
- 代码部分:
/*包含了主方法对快速排序的测试*/
public class QuickSort {
public static void quick(int [] arr, int low, int high){
int i = low;
int j = high;
//当左右哨兵相遇后就不再移动
if(i >= j){
return;
}
//此处取数组的第一个数为基准
int target = low;
while(i < j){
while(arr[j] > arr[target]){
j--;
}
while(arr[i] < arr[target]){
i++;
}
//交换两个哨兵指向的基准值
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//完成相遇点与基准值的交换
int temp = arr[target];
arr[target] = arr[i];
arr[i] = temp;
//将子序列传入,递归调用
quick(arr,low,target - 1);
quick(arr,target + 1, high);
}
public static void main(String[] args) {
int [] arr = {6, 8, 9, 7, 4, 3};
//调用排序算法
quick(arr,0,arr.length - 1);
//打印排序后的数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}