• 快速排序与归并排序


    实现原理:

    1. 快速排序:关键点是从队列中任意取出一个值,将其放在正确的位置(左边小于等于此数,右边大于等于此数),确定每个数自己的位置以后队列便是从小大大依次排序。
    2. 归并排序:先将队列拆封成两更小的队列,小队列依次排序,让后再将小队列合并,并确保顺序。

    代码:

     1 public class test {
     2     public static void main(String args[]) {
     3         int[] aa = { 4, 5, 2, 7, 8, 2, 1, 6, 4, 4, 3 };
     4         //quicksort(aa, 0, aa.length - 1);
     5         mergesort(aa, 0, aa.length - 1);
     6         for (int i : aa) {
     7             System.out.print(i + " ");
     8         }
     9     }
    10 
    11     /**
    12      * 快速排序
    13      * 
    14      * @param aa
    15      * @param begin
    16      * @param end
    17      */
    18     public static void quicksort(int[] aa, int begin, int end) {
    19         if (begin < end) {
    20             int b = begin;
    21             int e = end;
    22             int base = aa[begin];
    23             while (b < e) {
    24                 while (b < e && aa[e] >= base)
    25                     e--;
    26                 aa[b] = aa[e];
    27                 while (b < e && aa[b] <= base)
    28                     b++;
    29                 aa[e] = aa[b];
    30             };
    31             //b与e相等,任意取一个
    32             aa[b] = base;
    33             quicksort(aa, begin, b - 1);
    34             quicksort(aa, b + 1, end);
    35         }
    36     }
    37 
    38     /**
    39      * 归并排序
    40      * 
    41      * @param aa
    42      * @param begin
    43      * @param end
    44      */
    45     public static void mergesort(int[] aa, int begin, int end) {
    46         if (begin < end) {
    47             int middle = (begin + end) / 2;
    48             mergesort(aa, begin, middle);
    49             mergesort(aa, middle + 1, end);
    50             int[] tmpArr = new int[aa.length];
    51             int mid = middle + 1; // 右边的起始位置
    52             int tmp = begin;
    53             int third = begin;
    54             while (begin <= middle && mid <= end) {
    55                 // 从两个数组中选取较小的数放入中间数组
    56                 if (aa[begin] <= aa[mid]) {
    57                     tmpArr[third++] = aa[begin++];
    58                 } else {
    59                     tmpArr[third++] = aa[mid++];
    60                 }
    61             }
    62             // 将剩余的部分放入中间数组
    63             while (begin <= middle) {
    64                 tmpArr[third++] = aa[begin++];
    65             }
    66             while (mid <= end) {
    67                 tmpArr[third++] = aa[mid++];
    68             }
    69             // 将中间数组复制回原数组
    70             while (tmp <= end) {
    71                 aa[tmp] = tmpArr[tmp++];
    72             }
    73         }
    74     }
    75 }
  • 相关阅读:
    如何解决移动端滚动穿透问题
    如何在mac中通过命令行使用sublime
    正向代理和反向代理
    UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?
    依赖的版本
    如何移除inline-block元素之间的空白
    如何用JavaScript重定向到另一个网页?
    [读书笔记] 高性能网站建设指南
    java使用jconsole查看java程序运行(jmx原理)
    oracle相关知识点
  • 原文地址:https://www.cnblogs.com/gforce/p/5954699.html
Copyright © 2020-2023  润新知