Java使用二分插入排序竟然和直接插入排序速度比较



Java使用二分插入排序竟然和直接插入排序速度比较

之前测试过Python使用二分插入排序竟然比直接插入排序快99倍!

现在测试下 Java,Linux测试结果如下:

javac test.java

java test
InsertSort total milliseconds:15769
InsertSortWithBinarySerach total milliseconds:15657

更正下,上面的数据在一台虚拟机上测试的,所以样本不够,理论上,这两个算法的速度应该是有倍数差别的。

感谢执笔记忆的空白的指正,再次感谢评论的朋友!

以下是执笔记忆的空白的测试结果:

InsertSort total milliseconds:41496
InsertSortWithBinarySerach total milliseconds:10166

程序如下:

import java.util.Date;

public class test{

    public static void main(String []args){
       Date d1 = new Date();
       int[] a = new int[200000];
       for(int i=0;i<200000;i++)
       {
    	   a[i]=100-i;
       }

       InsertSort(a);
       Date d2 = new Date();
       System.out.println("InsertSort total milliseconds:"+(d2.getTime()-d1.getTime()));
 //printing the elements
 //for(int i=0;i<a.length;i++){
 //System.out.println(i+" : "+a[i]);
 //}

       Date d3 = new Date();
       int[] a2 = new int[200000];
       for(int i=0;i<200000;i++)
       {
    	   a2[i]=100-i;
       }

       InsertSortWithBinarySerach(a2);
       Date d4 = new Date();
       System.out.println("InsertSortWithBinarySerach total milliseconds:"+(d4.getTime()-d3.getTime()));
 //printing the elements
 //for(int j=0;j<a2.length;j++){
 //System.out.println(j+" : "+a2[j]);
 //}
    }

   public static void InsertSort(int[] A){
     for(int i = 1; i < A.length; i++){
       int value = A[i];
       int j = i - 1;
       while(j >= 0 && A[j] > value){
         A[j + 1] = A[j];
         j = j - 1;
       }
       A[j + 1] = value;
     }
   }
 public static void InsertSortWithBinarySerach(int[] A){
    for(int i=1;i<A.length;i++){
     int key=A[i];
     int pos=binarySearch(A,0,i-1,key); //finds where the element will be stored
     for(int j=i;j>pos;j--) //shifts the other elements by 1 position to the right
     A[j]=A[j-1];
     A[pos]=key; //places the key element in the pos position
     }
 }
 //uses binary search technique to find the position where the element will be inserted
 public static int binarySearch(int[] A,int low,int high,int key){
     int mid;
     while(low<=high){
         mid=(low+high)/2;
         if(key>A[mid])
             low=mid+1;
         else if(key<A[mid])
             high=mid-1;
         else
             return mid;
    }
    return low;
 }
} 
时间: 2024-08-01 18:58:22

Java使用二分插入排序竟然和直接插入排序速度比较的相关文章

Python使用二分插入排序竟然比直接插入排序快99倍!

 Python使用二分插入排序竟然比直接插入排序快99倍! 之前发布同一个算法,C++竟然比C快8倍!  , 有同学提出是因为C++中使用了二分插入排序,于是用python比较了下两种排序差距有多大. 测试结果如下: Python insertion sort took time: 1:39:42.448904Python insertion sort with binary search took time: 0:01:13.263267 代码如下: import datetime imp

Java实现二分查找算法实例分析_java

本文实例讲述了Java实现二分查找算法.分享给大家供大家参考.具体如下: 1. 前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2. 原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分.可能描述得不是很清楚,若是不理解可以去网上找.从描述上就可以看出这个算法适合

Java数据排序几种算法(堆排序 插入排序 快速排序)

堆排序算法 核心思想:用数组来表示完全二叉树,然后逐步把这个二叉树由半堆变成堆.经过不断转化,整个二叉树的根节点的值必然是最大的,然后把这个最大值放到二叉树最后的(数组的最后).以后再进行堆化的过程时候,就可以忽略这个元素.不断的重复将最大值放到数组后面,二叉树区间越来越小,直到只剩一个元素,就表示堆排序完成了.  代码如下 复制代码 import java.util.*; public class HeapSort{  public static void main(String[] args

Java实现二分查找算法

Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分.可能描述得不是很清楚,若是不理解可以去网上找.从描述上就可以看出这个算法适合用递归来实现,可以用递归的都可以用循环来实

我的Java开发学习之旅------&amp;gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可

详解直接插入排序算法与相关的Java版代码实现_java

直接插入排序 直接插入排序的思路很容易理解,它是这样的: 1.把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的. 2.从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置. 3.重复上述过程直到最后一个元素被插入有序子数组中. 4.排序完成. 示例:思路很简单,但代码并非像冒泡排序那么好写.首先,如何判断合适的位置?大于等于左边.小于等于右边?不行,很多边界条件需要考虑,而且判断次数太多.其次,数组中插入元素,必然需要移动大量元素,如何控制它们的

我的Java开发学习之旅------&amp;gt;Java经典排序算法之插入排序

一.算法原理 插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置. 假设我们输入的是 "53,27,36,15,69,  42" 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了"27, 53, 36, 15, 69, 42 " 接下来,我们看第3个数字有没有在正确的位置.这个数字是36,它的左边数字是53,36

内部排序:插入排序和希尔排序的N种实现

前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的. 注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实现,我自己都已测试通过,但不敢保证一定都没问题,如果有疑问,欢迎指出. 插入排序 插入排序的思想很简单,它的基本操作就是将一个数据插入到

数据结构教程 第三十四课 插入排序、快速排序

教学目的: 掌握排序的基本概念,插入排序.快速排序的算法 教学重点: 插入排序.快速排序的算法 教学难点: 快速排序算法 授课内容: 一.排序概述 排序:将一个数据元素的无序序列重新排列成一个按关键字有序的序列. 姓名 年龄 体重 1李由 57 62 2王天 54 76 3七大 24 75 4张强 24 72 5陈华 24 53 上表按年龄无序,如果按关键字年龄用某方法排序后得到下表: 姓名 年龄 体重 3七大 24 75 4张强 24 72 5陈华 24 53 2王天 54 76 1李由 57