- package cn.hyh_01;
- import java.util.Arrays;
- /*
- * 首先得明白快速排序的思想:
- * 第一阶段:
- * 1.将数组的第一个元素5(索引为0)与数组最后一个元素(索引为8)开始向左比较,找到比他小的就交换位置,
- * 如:(5,9,2,1,6,4,10,7,8)比较结束后变成(4,9,2,1,6,5,10,7,8),即5和4换了一个位置.
- * 2.再将5(索引为5)和第二个元素(索引为1)开始向右比较,找到比它大的就换位置,得(4,5,2,1,6,9,10,7,8),即5和9换位.
- * 3.再将5(索引为1)和第五个元素(索引为4)开始向左比较,找到比它小的就换位置,得(4,1,2,5,6,9,10,7,8),即5和1换位.
- * 4.再将5(索引为3)和第三个元素(索引为2)开始向右比较,找到比它大的就换位置,结果没找到,至此5的位置寻找结束,
- * 得到的结果是,5左边的数字都比它小,5右边的数字都比它大。
- * 第二阶段:
- * 1.从第一阶段我们得到了5在数组中的位置,并且5将数组分割成了两部分,分别是(4,1,2)和(6,9,10,7,8),这时,
- * 我们分别将第一部分和第二部分看成是一个独立的整体,重复第一阶段得到结果是:
- * (1,2,4)和(6,9,10,7,8)这时4和6的位置也确定了
- * 2.我们又得到两部分(1,2)和(9,10,7,8),继续重复第一阶段得到结果是:
- * (1)和(8,10,7,9)——(8,9,7,10)——(8,7,9,10),这时1和9的位置也确定了
- * 3.我们又得到两部分(8,7)和(10),通过第一阶段的比较得到(7,8)和(10)这时8和10的位置确定
- * 4.最后只剩(7),通过第一阶段的比较也确定了它的位置,至此排序结束。
- * 下面来进行代码实现:
- */
- public class QuickSort {
- public static void main(String[] args) {
- int[] arr = {5,9,2,1,6,4,10,7,81,1,8,6,5,3};
- quickSort(arr,0,arr.length-1);
- System.out.println(Arrays.toString(arr));
- }
- // 首先实现第一阶段的代码,通过定义一个方法:
- /*
- * 明确参数列表:
- * 1.被排序的数组
- * 2.要寻找最终位置的数据在数组中的初始位置
- * 3.从哪里开始比较(要比较的最大索引处,即最大边界)
- * 明确返回值:
- * 被寻找值的最终索引
- */
- public static int search(int[] arr, int target, int maxIndex) {
- int start = 0; //初始化最小边界
- while (start < maxIndex) { //最小边界大于或等于最大边界的时候就可以认为循环结束了。
- // 1.从右向左比较
- start = target + 1; //确定最小边界
- for (int i = maxIndex; i >= start; i--) {
- if (arr[target] > arr[i]) {
- // 找到比自己小的就换位置
- arr[target] = arr[i] ^ arr[target] ^ (arr[i] = arr[target]);
- // 并且继续用target记录自己的位置
- target = i;
- //找到了就跳出循环
- break;
- }
- }
- // 2.从左向右比较
- maxIndex = target - 1; //确定最大边界
- for (int i = start; i <= maxIndex; i++) {
- if (arr[target] < arr[i]) {
- // 找到比自己大的就换位置
- arr[target] = arr[i] ^ arr[target] ^ (arr[i] = arr[target]);
- // 并且继续用target记录自己的位置
- target = i;
- //找到了就跳出循环
- break;
- }
- }
- }
- return target;
- }
-
- //第二阶段代码:
- /* 经过简单的思考我们可以知道,第二阶段的循环嵌套次数是未知的(注意:不仅仅是循环次数未知),
- * 对于这种循环中嵌套循环,且嵌套次数未知的情况,我们使用方法的递归来实现:
- * 参数列表:
- * 在这个递归函数中我们将会用到之前定义的函数,所以参数列表与search方法的一致.
- * 返回值类型:
- * 只需要该方法为我们完成排序的需求,所以无返回值。
- *
- */
- public static void quickSort(int[] arr,int start,int end) {
- //得到arr[start]的位置,并且将数组分成了俩部分
- int target = search(arr,start,end);
- if (start<target-1) {
- //这里用来排序左边部分
- quickSort(arr,start,target-1);
- }
- if (target+1<end) {
- //这里用来排序右边部分
- quickSort(arr,target+1,end);
- }
- return;
- }
- }
复制代码
|