快速排序
原理 : 快速排序之所比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。
演示 :
演示数组 : [5, 3, 2, 1, 0, 10, 4, 8, 7, 9]
原数组:[5, 3, 2, 1, 0, 10, 4, 8, 7, 9]
交换值 :[5, 3, 2, 1, 0, 4, 10, 8, 7, 9] ==> 交换基准值 :[4, 3, 2, 1, 0, 5, 10, 8, 7, 9]
交换值 :[4, 3, 2, 1, 0, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 3, 2, 1, 4, 5, 10, 8, 7, 9] 保证5的左侧小于5, 右侧大于5
交换值 :[0, 3, 2, 1, 4, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 3, 2, 1, 4, 5, 10, 8, 7, 9]
交换值 :[0, 3, 2, 1, 4, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9]
交换值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9]
交换值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9]
交换值 :[0, 1, 2, 3, 4, 5, 10, 8, 7, 9] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 9, 8, 7, 10]
交换值 :[0, 1, 2, 3, 4, 5, 9, 8, 7, 10] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
交换值 :[0, 1, 2, 3, 4, 5, 7, 8, 9, 10] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
交换值 :[0, 1, 2, 3, 4, 5, 7, 8, 9, 10] ==> 交换基准值 :[0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
现数组:[0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
代码 :
/**
* 快速排序
*/
public class QuikSort {
public static void quik_sort(int arr[], int left, int right){
if(left > right) return;
int pivot = arr[left];
int i = left;
int j = right;
while(i < j){
// 查找从右侧开始第一个大于基准值的数的下标
while (pivot <= arr[j] && i < j) j--;
// 查找从左侧开始第一个小于基准值的数的下标
while (pivot >= arr[i] && i < j) i++;
// 找到后交换位置
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
System.out.print("交换值 :" + Arrays.toString(arr));
// 交换中间位置arr[i]和基准值
arr[left] = arr[i];
arr[i] = pivot;
System.out.println(" ==> 交换基准值 :" + Arrays.toString(arr));
// 迭代[left, i-1]处的数组
quik_sort(arr, left, i-1);
// 迭代[i+1, right]处的数组
quik_sort(arr, i+1, right);
}
public static void main(String[] args){
int arr[] = new int[] {5, 3, 2, 1, 0, 10, 4, 8, 7, 9};
System.out.println("原数组:");
System.out.println(Arrays.toString(arr));
QuikSort.quik_sort(arr, 0, arr.length-1);
System.out.println("现数组:");
System.out.println(Arrays.toString(arr));
}
}