• 快速排序法


     1 public static int adjustArray(int[] a, int first, int last){
     2         int i = first;
     3         int j = last;
     4         //取第一个数为基准数,也就是第一个坑
     5         int x = a[i];
     6         while (i < j){
     7             //从右向左找小于x的数来填坑
     8             //a[j]等于x或比x大则继续往左找
     9             while (i < j && a[j] >= x){
    10                 j--;
    11             }
    12             //当找到a[j]比x小的数时,要先判断此时i是否小于j
    13             //然后把a[j]填入a[i]中,此时a[j]成为新的坑
    14             if (i < j){
    15                 a[i] = a[j];
    16                 i++;
    17             }
    18             //接着从左往右找大于等于x的数来填坑
    19             //a[i]比x小则继续往右找
    20             while (i < j && a[i] < x){
    21                 i++;
    22             }
    23             //当找到a[i]大于等于x的数时,要先判断此时i是否小于j
    24             //然后把a[i]填入a[j]中,此时a[i]成为新的坑
    25             //然后这整个过程一直持续到i = j的时候退出
    26             if (i < j){
    27                 a[j] = a[i];
    28                 j--;
    29             }
    30         }
    31         //退出时,i = j,最后将x填到这个坑中
    32         a[i] = x;
    33         //返回的这个数为基准数最后落到的坑的位置,此时,基准数前面的数都比它小,后面的数都比他大
    34         //接下来要做的事情,是对基准数左边的部分和右边的部分重复这个方法
    35         return i;
    36     }
    37     
    38     public static void quick_sort1(int[] a, int first, int last){
    39         //刚开始肯定first比last小的,毕竟fisrt是0,last是a.length - 1;
    40         if (first < last){
    41             int i = adjustArray(a, first, last);
    42             //然后不断递归对i位置左边的那部分和i位置右边那部分调用此方法
    43             //直到调用不了为止,就排好序了
    44             quick_sort1(a, first, i - 1);
    45             quick_sort1(a, i + 1, last);
    46         }
    47     }
    48     
    49     //将以上两个方法合起来就是:
    50     public static void quick_sort(int[] a, int first, int last){
    51         if (first < last){
    52             int i = first;
    53             int j = last;
    54             int x = a[i];
    55             while (i < j){
    56                 while (i < j && a[j] >= x){
    57                     j--;
    58                 }
    59                 if (i < j){
    60                     a[i] = a[j];
    61                     i++;
    62                 }
    63                 while (i < j && a[i] < x){
    64                     i++;
    65                 }
    66                 if (i < j){
    67                     a[j] = a[i];
    68                     j--;
    69                 }
    70             }
    71             a[i] = x;
    72             quick_sort1(a, first, i - 1);
    73             quick_sort1(a, i + 1, last);
    74         }
    75     }

    Written on October 16th, 2019

  • 相关阅读:
    算法总结之 两个链表生成相加链表
    算法总结之 复制含有随机指针节点的链表
    算法总结之 将单向链表按某值划分成左边小、中间相等、右边大的形式
    在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案
    windows下配置nginx+php环境
    ecmall程序结构图与数据库表分析
    ecmall数据字典
    Ecmall二次开发-增删改查操作
    PHP7:10件事情你需要知道的
    PHP命名空间规则解析及高级功能3
  • 原文地址:https://www.cnblogs.com/LittleMike/p/11687112.html
Copyright © 2020-2023  润新知