• 快速排序算法


    快速排序一:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[3,1,2,3,5,6 ],也就是原数组最后一个数是3,排序完之后小于等于3的全部在3的左边,大于3的全部在3的右边

    解题思路:

    1、我们定义一个小于目标数据的区域,它的初始位置在数组第一个元素的前面,也就是下标为-1的位置,取名为lessEquals

    2、定义一个移动的指针,初始值为指向数组的第一个元素,取名为cur,初始值为0

    3、循环判断,当cur小于数组长度的时候,将cur指向的数据与数组最后一个元素对比,如果小于等于最后一个元素,那么将lessEquals的下一个数据与cur指向的数据交换,否则cur++,移动到数组下一个为止

    代码实现:

    1. private void printArray(int[] arr) {
    2. for (int i : arr) {
    3. System.err.print(i + " ");
    4. }
    5. }
    6. private void swap(int[] arr, int a, int b) {
    7. int tmp = arr[a];
    8. arr[a] = arr[b];
    9. arr[b] = tmp;
    10. }
    11. public void quickSort(int[] arr) {
    12. int lessEquals = -1;
    13. int cur = 0;
    14. int last = arr.length - 1;
    15. while (cur <= last) {
    16. if (arr[cur] <= arr[last]) {
    17. lessEquals++;
    18. swap(arr, lessEquals, cur);
    19. cur++;
    20. } else {
    21. cur++;
    22. }
    23. }
    24. }
    25. @Test
    26. public void testQuickSort() {
    27. int arr[] = new int[]{5, 6, 3, 1, 2, 3};
    28. quickSort(arr);
    29. printArray(arr);
    30. }

    快速排序二:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,等于的全部在中间,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[1,2,3,3,5,6 ],也就是原数组最后一个数是3,排序完之后小于等于3的全部在3的左边,大于3的全部在3的右边,等于3的全部在中间

    解题思路同上面的快速排序1类似,只是在前面的基础之上增加了一个大于目标数的区域,假设变量命名为greater,初始值指向数组最后一个元素,同时在循环的时候判断条件有所增加,小于的逻辑与前面快速排序1一样,如果cur指向的数据大于数组最后一个元素,那么那么将greater前面的元素与cur指向的元素交换,同时greater往数组的前面移动,直到cur碰上greater的时候退出循环

    代码实现:

    1. public void quickSort1(int[] arr) {
    2. int lessEquals = -1;
    3. int cur = 0;
    4. int greater = arr.length - 1;
    5. while (cur <= greater) {
    6. if (arr[cur] < arr[arr.length - 1]) {
    7. lessEquals++;
    8. swap(arr, lessEquals, cur);
    9. cur++;
    10. } else if (arr[cur] > arr[arr.length - 1]) {
    11. greater--;
    12. swap(arr, greater, cur);
    13. } else {
    14. cur++;
    15. }
    16. }
    17. swap(arr, greater, arr.length - 1);
    18. }
    19. @Test
    20. public void testQuickSort1() {
    21. int arr[] = new int[]{5, 6, 3, 1, 2, 3};
    22. quickSort1(arr);
    23. printArray(arr);
    24. }

    快速排序三:在快速排序二的基础之上,要求排序完成之后整个数组有序,也就是说要求左右两边的子数组都有序,实现思路就是基于快速排序二做递归迭代,对左右两边的子数组继续做快排

    1. public int[] quickSort1V2(int[] arr, int left, int right) {
    2. int cur = left;
    3. int greater = right;
    4. while (cur < greater) {
    5. if (arr[cur] < arr[right]) {
    6. swap(arr, left, cur);
    7. left++;
    8. cur++;
    9. } else if (arr[cur] > arr[right]) {
    10. greater--;
    11. swap(arr, greater, cur);
    12. } else {
    13. cur++;
    14. }
    15. }
    16. swap(arr, greater, right);
    17. return new int[]{left, greater};
    18. }
    19. public void quickSort2(int arr[], int l, int r) {
    20. if (arr == null || arr.length < 2) {
    21. return;
    22. }
    23. if (l >= r) {
    24. return;
    25. }
    26. int index[] = quickSort1V2(arr, l, r);
    27. quickSort2(arr, l, index[0] - 1);
    28. quickSort2(arr, index[1] + 1, r);
    29. }
    30. @Test
    31. public void testQuickSort2() {
    32. int arr[] = new int[]{5, 6, 3, 1, 2, 3};
    33. quickSort2(arr, 0, arr.length - 1);
    34. printArray(arr);
    35. }

  • 相关阅读:
    游戏引擎,脚本管理模块
    IF:伴FLT3-ITD突变的急性髓系白血病在米哚妥林治疗下的克隆进化
    shell脚本自学笔记
    音视频质检及画质评估——为QoS & QoE 指标保驾护航
    Redis五种基本数据类型
    卷不动了?!这些互联网大厂“养老公司”了解一下
    【CSS】浅谈css兄弟选择器
    RabbitMQ--交换机
    红队打靶:Misdirection打靶思路详解(vulnhub)
    git命令
  • 原文地址:https://blog.csdn.net/qq_17805707/article/details/134048614