【排序思想】
快速排序思路:* 类说明 :快速排序
- 1.在一组数据中,选择一个数作为基准(一般选择第一个数)
- 2.所有小于“基准”的元素,都移到“基准”的左边,所有大于"基准"的元素都移动到右边
- 3.对基准左右两边的元素不断重复1.2两步操作,直到所有子集的下一个元素为止。
上图只是给出了第1趟快速排序的流程。在第1趟中,设置x=a[i],即x=30。
(01) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=20,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。
(02) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=40,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。
(03) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=10,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。
(04) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=60,此时i=2;然后将a[i]赋值a[j],此时j=3;接着从右往左遍历。
(05) 从"右 --> 左"查找小于x的数:没有找到满足条件的数。当i>=j时,停止查找;然后将x赋值给a[i]。此趟遍历结束!
按照同样的方法,对子数列进行递归遍历。最后得到有序数组!
【代码演示】
package com.myjava.quicksort;
import java.util.Arrays;
/**
*
* @author Xiao er:
*
* @version 创建时间:2019年4月1日 下午9:13:54
* 类说明 :快速排序
* 1.在一组数据中,选择一个数作为基准(一般选择第一个数)
* 2.所有小于“基准”的元素,都移到“基准”的左边,所有大于"基准"的元素都移动到右边
* 3.对基准左右两边的元素不断重复1.2两步操作,直到所有子集的下一个元素为止
*/
public class QuickSort {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 12, 23, 435, 56, 73, 3, 1 };
System.out.println("排序前:" + Arrays.toString(arr));
sort(arr, 0, arr.length - 1);
System.out.println("排序后:" + Arrays.toString(arr));
}
/**
* @param arr 需要排序的数组
* @param low 开始左边的数
* @param high 右边的数
*/
public static void sort(int[] arr, int low, int high) {
// 循环跳出
if (low >= high) {
return;
}
/*
* 由于在一趟排序过程中low和high所对应的数永远是不变的 在数组进行起始排序时
* 两个“指针”i和j,指向数组的开始和结束两个元素
*/
int i = low;
int j = high;
/*
* 定义基准数 在开始排序的过程中,将数组的第一个数作为基准数,
* 用于i和j对应的数进行比较,
* 将较小的数放在基准数的右侧,将较大的数放到基准数的右侧
*/
int key = arr[i];
// 当i>=j时,说明数组已经排序完成
while (i < j) {
// 当数组中地arr[j]个元素比key基准大时,不用比较进行下一个比较
while (arr[j] >= key && i < j) {
j--;
}
// 如果上述条件不成立则进行换位
if (i < j) {
int t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
// 数组中arr[i]元素比key基准数小时,无需比较直接跳过
while (arr[i] <= key && i < j) {
i++;
}
// 上述条件不成立时,进行换位
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
/**
* 在一趟排序完毕后,基准数的右侧放的都是无序的比基准数小的数 在基准数右侧放的都是无序的比基准数较大的数
* 例如:3,1,12(基准数),23,435,56,73 所以在此对基准数左右的无序“大小数”进行再次排序
*/
// 交换完毕一次后对基准左侧的“较小的数”进行排序
// 将基准数左侧的小数看成一个数组进行比较排序
sort(arr, low, i - 1);
// 对基准右侧的“较大的数”进行排序
sort(arr, i + 1, high);
}
}
}
排序算法大全:https://blog.youkuaiyun.com/mirror_w/article/category/8856271
小二课堂:https://blog.youkuaiyun.com/Mirror_w