-
快速排序
快速排序较于较于排序优点:
- 冒泡排序每一次的遍历,只找到需要的元素,遍历的次数多,虽然可以优化,但约等于可以O(n*n);
- 快速排序,每一次遍历对原区间一分为二,约等于看成O(logn);
-
上图说话,假设原数组:4936258,两个关键点,首尾下标
4 9 3 6 2 5 8 start end 以start下标的元素为基点,做对比,思路:比4大的元素放右边,比4小的放左边,在递归操作,就能达到我们要的效果;
判断过程:
8比4大,不需要操作,end往前移动一位,5比4大不需要操作,end往前移动一位,2比4小,需要操作,交换元素,未交换元素前下标元素对应关系图:
4 9 3 6 2 5 8 start end 交换元素后结果:
2 9 3 6 4 5 8 start end 这个时候需要从start下标位置判断,2小于4,start下标前移一位,9比4大,需要交换元素,交换元素后结果图:
2 4 3 6 9 5 8 start end 依次操作,最后start = end,退出循环,首次结果是:
2 3 4 6 9 5 8 下面就是执行递归,代码如下:
import com.alibaba.fastjson.JSON; /** * @ClassName ThreeLeetCode * @date 2021/7/14 15:29 * @Description 快速排序 * @Author bXiua * @Version 1.0 */ public class ThreeLeetCode { public static void main(String[] args) { int[] arrays =new int[]{11,9,3,6,2,5,8,0,122,1,56,2,66,4,77,5}; sortNumber(arrays,0,arrays.length-1); System.out.println(JSON.toJSONString(arrays)); } private static int sortNumber(int[] arrays, int start, int end) { if (start < end) { int index = getIndex(arrays, start, end); sortNumber(arrays, start,index - 1); sortNumber(arrays,index + 1, end); } return start; } private static int getIndex(int[] arrays, int start, int end) { int temp = arrays[start]; while (start < end) { while (arrays[end] >= temp && start < end) { end--; } arrays[start] = arrays[end]; arrays[end] = temp; while (arrays[start] <= temp && start < end) { start++; } temp = arrays[end]; arrays[end] = arrays[start]; arrays[start] = temp; } return start; } }
10-14
3429
09-30
1081
11-13
789
11-11
442