zoukankan      html  css  js  c++  java
  • java基础算法-快速排序

    玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进eclipse中右键 run as --》java application 即可。控制台清晰打印出快排的过程

     1 package test;
     2 
     3 
     4 /**
     5  * 
     6  * 排序算法测试类
     7  *
     8  */
     9 public class TestForSort {
    10 
    11     /**
    12      * @param args
    13      */
    14     public static void main(String[] args) {
    15         int[] array = new int[] {4,1,5,3,2,6};
    16         //快排
    17         quicksort(array,0,array.length-1);
    18         System.out.println("=======最终=========");
    19         for(int a:array){
    20             System.out.print(a);
    21         }
    22     }
    23 
    24     /**
    25      * 快速排序
    26      *
    27      * @param int n[] 要排序的数组
    28      * @param left 排序开始下标
    29      * @param right 排序结束下标
    30      * @return
    31      */
    32     static void quicksort(int n[], int left, int right) {
    33         int dp;
    34         if (left < right) {
    35             dp = partition(n, left, right);//分治法,返回中轴下标
    36             quicksort(n, left, dp - 1);//左边递归快排
    37             quicksort(n, dp + 1, right);//右边递归快排
    38         }
    39     }
    40  
    41     /**
    42      * 快排核心算法,并返回中轴下标
    43      * @param n   要分治的数组
    44      * @param left 首位下标
    45      * @param right 末位下标
    46      * @return
    47      */
    48     static int partition(int n[], int left, int right) {
    49         
    50         //数组的第一个作为中轴(顺道保留了左值)
    51         int pivot = n[left];
    52         System.out.println("==================排序前====================");
    53         System.out.println("中轴值="+pivot);
    54         System.out.println("=======每次分治========= ,left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+"");
    55         //左<右才执行,即为一直到i=j时为止,此时ij碰撞的位置就是中轴
    56         while (left < right) {
    57             //找到第一个比中轴小的数n[rigth]
    58             while (left < right && n[right] >= pivot){
    59                 right--;
    60             }
    61             //把第一个比中轴小的输n[right]赋值给n[left],然后left右移一位
    62             if (left < right){
    63                 System.out.println("把n["+right+"]赋值给n["+left+"],left右移一位");
    64                 n[left++] = n[right];
    65             }
    66             //找到第一个比中轴大的数n[left]
    67             while (left < right && n[left] <= pivot){
    68                 left++;
    69             }
    70             //把第一个比中轴大的数n[left]赋值给n[right],并right左移一位
    71             if (left < right){
    72                 System.out.println("把n["+left+"]赋值给n["+right+"],right右移一位");
    73                 n[right--] = n[left];
    74             }
    75         }
    76         //中轴赋值给最终左值(下一个递归的中轴下标)
    77         n[left] = pivot;
    78         System.out.println("==================排序后====================");
    79         System.out.println("中轴值="+pivot+"下标="+left);
    80         System.out.println("left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+"");
    81         
    82         for(int a:n){
    83             System.out.print(a);
    84         }
    85         System.out.println();
    86         //返回中轴下标
    87         return left;
    88         
    89     }
    90 }
  • 相关阅读:
    php下 MVC实现的基本思路
    Apache 文件路径中“/”和“\”的问题
    PHP isset 函数作用
    适用于 php5.2 的 php.ini 中文版
    fedora17 用hostapd搭建无线wifi
    从看雪的一个沙箱代码中扣出的InlineHook代码
    添加psapi.h头文件之前要先添加Windows.h
    virtualbox中的window xp如何共享linux主机的文件
    Linux驱动开发之LDD3中第三章scull注释详解【转】
    Linux内核代码 结构体初始化【转】
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/5456637.html
Copyright © 2011-2022 走看看