• 快速排序


    描述思想:选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后,取基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各子序列剩余一个元素时,即排序完成。

     1  /**
     2      * 快速排序
     3      * 思路:选取基准元素tmp = arr[start],先后从往前遍历,如果tmp < arr(end),则end--,
     4      * 直到tmp >= arr(end),此时让arr[start]=arr[end]
     5      * 然后从左往右遍历,如果tmp > arr[start],start++,
     6      * 直到tmp <= arr[start],此时让arr[end]=arr[start]
     7      *
     8      * 这样遍历一次之后,tmp所在的位置就是中间位置,同理,遍历tmp左边和右边的子数组。
     9      * 最终循环结束,就是有序的数组
    10      * @param arr - 数组
    11      * @param start - 起始位置
    12      * @param end - 结束位置
    13      */
    14     public static void quickSort(int [] arr, int start, int end) {
    15         //数组arr空or仅有一个元素则退出
    16         if (start >= end - 1)
    17             return;
    18 
    19         if (start < end) {
    20             //寻找基准元素的位置
    21             int index = getIndex(arr, start, end);
    22 
    23             //遍历index位置左边和右边的子数组。
    24             quickSort(arr, 0, index - 1);
    25             quickSort(arr, index + 1, end);
    26         }
    27     }
    28     public static int getIndex(int [] arr, int start, int end) {
    29 
    30         //选取基准数据
    31         int tmp = arr[start];
    32 
    33         while (start < end) {
    34             //开始从右往左遍历,当队尾元素大于等于tmp时,向前挪动指针
    35             while (start < end && tmp <= arr[end]) {
    36                     end--;
    37             }
    38             //执行到这里说明tmp大于arr[end]了,让end位置的值赋值给start位置的值
    39             arr[start] = arr[end];
    40 
    41             //开始从左往右遍历,当队首元素小于等于tmp时,向后挪动指针
    42             while (start < end && tmp >= arr[start]) {
    43                 start++;
    44             }
    45             arr[end] = arr[start];
    46         }
    47 
    48         //执行到这里,start和end肯定相等,也就是tmp的位置,需要将tmp赋值给arr[start]
    49         arr[start] = tmp;
    50         return start;
    51     }
    52 
    53     public static void main(String[] args) {
    54         int [] arrs = {8,12,6,13,4,23};
    55         quickSort(arrs, 0, arrs.length - 1);
    56         System.out.println("=====排序之后======");
    57         for(int e : arrs) {
    58             System.out.print(e + "  ");
    59         }
    60     }
  • 相关阅读:
    Windows命令处理进程
    Linux 文件权限管理
    Linux 用户与用户组管理
    Linux 文件类型及操作
    快速了解必要的网络知识
    SSH免密码登录
    用SSH访问内网主机的方法
    MongoDB与PostgresQL无责任初步测试
    SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?
    Netty5使用自签证书实现SSL安全连接
  • 原文地址:https://www.cnblogs.com/hkdpp/p/11834788.html
Copyright © 2020-2023  润新知