zoukankan      html  css  js  c++  java
  • 快速排序与归并排序

    实现原理:

    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 }
  • 相关阅读:
    VHD进阶:差分VHD备份系统
    默认系统为UEFI启动的GPT分区的WIN7(8),如何安装VHD的UEFI WIN8(7)
    在WIN7/8下把XP装入VHD (上)
    USB鼠标线序
    组合与继承
    结构体内存对齐
    多媒体编码与格式
    网络病毒
    寄存器
    0
  • 原文地址:https://www.cnblogs.com/gforce/p/5954699.html
Copyright © 2011-2022 走看看