快速排序
同样采用了分治的思想,但是不同于归并中分解时出现的大小相等的子数组,快速排序分解出来的两个数组长度不一样相等。但在合并过程中也是类似的,同样是有序的数组的合并,不同的是不再是两个子数组之间的排序,而是两数组内部的重排。
- 快速排序的核心是在数组中任意选定一个值作为标志位x,小于标志的的数组元素放在数组左侧,大于标志的数组元素放在右侧。保证左侧的数组都是小于x,右侧的数组都是大于x。但是分解的过程其实也就是在合并。因为此时得到的数组算是部分有序的。
- 对两个数组同样需要进行类似的操作,依次递归。最后得到就是完整的数组
2020/8/15 目前还是没有特别理解,以后有新的理解继续补上
快速排序demo
package Sort;
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;
public class QuickSort {
static Scanner sc = new Scanner(new BufferedInputStream(System.in));
final static int N = (int) 1e6 + 10;
/**
* 交换数组中的所用
*
* @param arr - 输入数组
* @param i - 第一个数的索引
* @param j - 第二个数的索引
*/
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
/**
* 快速排序的具体实现
*
* @param arr - 待排序数组
* @param l - 左边界
* @param r - 右边界
*/
public static void quickSort(int[] arr, int l, int r){
// 终止条件
if (l >= r) return;
// 方便下面地使用
int i = l - 1;
int j = r + 1;
// 先进行分治,选择合适的位置,一般为中点。
// 双指针指向,在原数组中划分出两个数组。结束之后,部分有序
int flag = arr[(i + j ) >> 1];
while (i < j){
do i++; while (arr[i] < flag);
do j--; while (arr[j] > flag);
if (i < j) swap(arr, i ,j);
}
//开始分治
quickSort(arr, l, j);
quickSort(arr, j + 1, r);
}
public static void main(String[] args){
int n = sc.nextInt();
int[] arr = new int[N];
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
quickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
}
}