zoukankan      html  css  js  c++  java
  • 在java下Array.Sort和(自己写的)快速排序到底那个快?

          近期做java实习题时,无意间用到了快速排序,当时因为忘记了,上网搜了一下......可搜的搜的我思考一个问题:在java下Array.Sort和(自己写的)快速排序到底那个快?

          网上有很多博主讨论过这个问题,他们做出的结论都是System.Array.Sort比自己写的排序算法要快很多,例如:http://www.cnblogs.com/Mainz/archive/2008/04/22/1165429.html的答案就是这样的!自己怀着好奇的心态在java下做了一下,可结果......

    微软MSDN上对System.Array.Sort的说明: 

         “Array 中的每个元素均必须实现 IComparable 接口,才能与 array 中的其他所有元素进行比较。如果排序不能成功地完成,则结果未定义。此方法使用 QuickSort 算法。此实现执行不稳定排序;亦即,如果两元素相等,则其顺序可能不被保留。相反,稳定排序保留相等元素的顺序。 一般情况下,此方法的运算复杂度为 O(n log n),其中 n 是 array 的 Length;最坏的情况下其运算复杂度为 O(n ^ 2)。”

    java程序比较:
     1 import java.util.Arrays;
     2 import java.util.Random;
     3 import java.util.Scanner;
     4 
     5 public class QuickSort {
     6     public static void Quicksort(int[] a,int Left,int Right){
     7         int left,right,temp,middle;
     8         middle=a[(Left+Right)/2];
     9         left=Left;
    10         right=Right;
    11         do{
    12             //从左边寻找大于中间值的下标
    13             while(left<Right&&a[left]<middle){
    14                 left++;
    15             }
    16             //从右边寻找小于中间值的下标
    17             while(right>Left&&a[right]>middle){
    18                 right--;
    19             }
    20             //找到一对,对换他们
    21             //注意:如果少了等于号,会长生死循环
    22             if(left<=right){
    23                 temp=a[left];
    24                 a[left]=a[right];
    25                 a[right]=temp;
    26                 left++;
    27                 right--;
    28             }
    29             
    30         }while(right>=left); //直到左右对换
    31         
    32         if(Left<right){
    33             Quicksort(a,Left,right);
    34         }
    35         
    36         if(Right>left){
    37             Quicksort(a,left,Right);
    38         }
    39     }
    40     
    41     public static void main(String[] args) {
    42         // TODO Auto-generated method stub
    43         Scanner myscnner=new Scanner(System.in);
    44         System.out.println("请输入排序数组大小:");
    45    
    46         int n=myscnner.nextInt();
    47         int[] a=new int[n];
    48         
    49         Random random=new Random();
    50         for (int i = 0; i < a.length; i++) {
    51             a[i]=Math.abs(random.nextInt())%10000000;
    52         }
    53         
    54         //System.Array.Sort执行时间以及执行结果
    55         System.out.println("System.Array.Sort执行时间以及执行结果:");
    56         long t=System.nanoTime();
    57         Arrays.sort(a,0,a.length);
    58         for (int i = 0; i < a.length; i++) {
    59             System.out.print(a[i]+" ");
    60         }
    61         System.out.println();
    62         System.out.println(System.nanoTime()-t);
    63         
    64         //My QuickSort执行时间以及执行结果
    65         System.out.println("My QuickSort执行时间以及执行结果:");
    66         long t2=System.nanoTime();
    67         Quicksort(a,0,n-1);
    68         for (int i = 0; i < a.length; i++) {
    69             System.out.print(a[i]+" ");
    70         }
    71         System.out.println();
    72         System.out.println(System.nanoTime()-t2);
    73     }
    74 
    75 }

    运行结果截图:

     当数组很小时:

    逐渐增大:

    自己很惊奇,难道java下这个问题的答案是:Array.Sort小于(自己写的)快速排序。

    不知道自己得出的结论是否正确,我多次实验过,得出的结果都是一样的!

    希望看到此篇的牛人们看有没有问题???邮箱联系(15658081582@163.com)

  • 相关阅读:
    RabbitMQ In JAVA 介绍及使用
    利用消息队列处理分布式事务
    SpringBoot入门篇--关于properties和yml两种配置文件的一些事情
    消息队列
    多线程-- ThreadLocal
    简单ORACLE分区表、分区索引
    OR 连接查询注意
    二分查找算法(JAVA)
    逻辑回归与决策树在分类上的一些区别
    从一个R语言案例学线性回归
  • 原文地址:https://www.cnblogs.com/xiaofengkang/p/2511751.html
Copyright © 2011-2022 走看看