Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)

目录
  • 1.查找概述
  • 2.顺序查找
  • 3.二分查找
    • 3.1 二分查找概述
    • 3.2 二分查找实现
  • 4.插值查找
    • 4.1 插值查找概述
    • 4.2 插值查找实现
  • 5.斐波那契查找
    • 5.1 斐波那契查找概述
    • 5.2 斐波那契查找实现
    • 5.3 总结

1.查找概述

查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表。查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。

查找(Searching): 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。若表中存在这样的一个记录,则称查找是成功的,此时查找的结果给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个“空”记录或“空”指针。

查找表分类: 查找表按照操作方式来分有两大种:静态查找表和动态查找表。

静态查找表(Static Search Table),只作查找操作的查找表。它的主要操作有:

  1. 查询某个“特定的”数据元素是否在查找表中。
  2. 检索某个“特定的”数据元素和各种属性。

动态查找表(Dynamic Search Table),在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。显然动态查找表的操作就是两个:

  1. 查找时插入数据元素。
  2. 查找时删除数据元素。

查找结构: 为了提高查找的效率,我们需要专门为查找操作设置数据结构,这种面向查找操作的数据结构称为查找结构。

从逻辑上来说,查找所基于的数据结构是集合,集合中的记录之间没有本质关系。可是要想获得较高的查找性能,我们就不能不改变数据元素之间的关系,在存储时可以将查找集合组织成表、树等结构。

例如,对于静态查找表来说,我们不妨应用线性表结构来组织数据,这样可以使用顺序查找算法,如果再对主关键字排序,则可以应用二分查找等技术进行高效的查找。

如果是需要动态查找,则会复杂一些,可以考虑二叉排序树的查找技术。

另外,还可以用散列表结构来解决一些查找问题。

2.顺序查找

顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。

顺序查找一般是一种在数组中查找数据的算法,是一种静态查找。

顺序查找的实现: 顺序查找非常简单,就是从头开始遍历内部数组,查看有没有关键字(key)。有的话就返回对应的索引。

设数组元素数量为n,则顺序查找的查找成功最短时间为O(1),最长为O(n),查找失败时间为O(n)。记作O(n)。

3.二分查找

3.1 二分查找概述

每次取中间记录查找的方法叫做二分查找。二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

设有序数组元素数量为n,将其长度减半log n 次后,其中便只剩一个数据了,这样就能百分之百确定元素是否存在,则二分查找的查找成功最短时间为O(1),最长为O(logn)。查找失败最短时间为时间为O(1),最长为O(logn)。记作O(logn)。

二分查找的时间复杂度为O(logn),与线性查找的O(n) 相比速度上得到了指数倍提高(x = log2n,则n = 2^x)。但是,二分查找必须建立在数据已经排好序的基础上才能使用,因此添加数据时必须加到合适的位置,这就需要额外耗费维护数组的时间。 而使用线性查找时,数组中的数据可以是无序的,因此添加数据时也无须顾虑位置,直接把它加在末尾即可,不需要耗费时间。

综上,具体使用哪种查找方法,可以根据查找和添加两个操作哪个更为频繁来决定。

3.2 二分查找实现

对如下数据{0,1,16,24,35,47,59,62,73,88,99}进行二分查找,是否存在73、72这两个数。

public class Bisearch {
    /**
     * 有序的数组
     */
    public int[] elements = new int[]{1, 16, 24, 35, 47, 59, 62, 73, 88, 99};

    @Test
    public void test1() {
        //7
        System.out.println(bisearch(73));
        //4
        System.out.println(bisearch(47));
        //-1
        System.out.println(bisearch(72));

        //求logn
        System.out.println(Math.log((double) 10) / Math.log((double) 2));
    }

    /**
     * 折半查找的实现
     *
     * @param key 要查找的数据
     * @return 查找到的索引, 或者-1 表示查找到
     */
    public int bisearch(int key) {
        int low = 0;
        int high = elements.length - 1;
        int mid;
        //不在范围内,直接返回-1
        if (elements[low] > key || elements[high] < key) {
            return -1;
        }
        //开始折半查找
        while (low <= high) {
            //折半
            mid = (low + high) / 2;
            /*若查找值比中值小*/
            if (elements[mid] > key) {
                //最高下标调整到中位下标小一位
                high = mid - 1;
                /*若查找值比中值大*/
            } else if (elements[mid] < key) {
                //最低下标调整到中位下标大一位
                low = mid + 1;
                /*若查找值等于中值*/
            } else {
                //说明mid即为查找到的位置
                return mid;
            }
        }
        //未查找到,返回-1
        return -1;
    }
}

上面的数据,采用二分查找之后其查找结构如下图:

从上图可以看出来二分查找等于是把静态有序查找表分成了两棵子树,即查找结果只需要找其中的一半数据记录即可,等于工作量少了一半,然后继续二分查找,循环重复执行该操作就可以找到目标数据,或得出目标数据不存在的结论,最高需要查找logn≈4次。效率当然是非常高了。

4.插值查找

4.1 插值查找概述

插值查找(Interpolation Search),有序表的一种查找方式。 插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。

这里的自适应,很好解释,比如要在取值范围0~10000之间100个元素从小到大均匀分布的数组中查找5,我们自然会考虑从数组下标较小的开始查找。 将二分查找中的求 mid 索引的公式,变换一下格式得到:

也就是mid等于最低下标low加上最高下标high与low的差的一半。算法科学家们考虑的就是将这个1/2进行改进,改进为下面的计算方案:

假设a[10]={1,16,24,35,47,59,62,73,88,99},low=0,high=9,则a[low]=1,a[high]=99,如果我们要找的是key=16时,按原来折半的做法,我们需要四次才可以得到结果,但如果用新办法,计算(key-a[low])/(a[high]-a[low])=(16-1)/(99-1)≈0.153,即mid≈0+0.153×(9-0)=1.377,取整得到mid=1,我们只需要一次就查找到结果了,显然大大提高了查找的效率。

这就是插值查找和二分查找的不同之处,插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式(key-a[low])/(a[high]-a[low])。从时间复杂度来看,它也是O(logn),但对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好得多。反之,由于插值的计算依赖于最大值和最小值,因此数组中如果分布类似{0,1,2,2000,2001,......,999998,999999}这种极端不均匀的数据,用插值查找效率比二分查找低。因此插值查找应用有限。

4.2 插值查找实现

public class FibonacciSearch {
    /**
     * 有序的数组
     */
    public int[] elements = new int[]{1, 16, 24, 35, 47, 59, 62, 73, 88, 99};

    /**
     * 插值查找的实现
     *
     * @param key 要查找的数据
     * @return 查找到的索引, 或者-1 表示查找到
     */
    public int interpolationSearch(int key) {
        int low = 0;
        int high = elements.length - 1;
        int mid;
        //不在范围内,直接返回-1
        if (elements[low] > key || elements[high] < key) {
            return -1;
        }
        //开始插值查找
        while (low <= high) {
            //插值
            mid = low + (high - low) * (key - elements[low]) / (elements[high] - elements[low]);
            /*若查找值比中值小*/
            if (elements[mid] > key) {
                //最高下标调整到中位下标小一位
                high = mid - 1;
                /*若查找值比中值大*/
            } else if (elements[mid] < key) {
                //最低下标调整到中位下标大一位
                low = mid + 1;
                /*若查找值等于中值*/
            } else {
                //说明mid即为查找到的位置
                return mid;
            }
        }
        //未查找到,返回-1
        return -1;
    }

    @Test
    public void test1() {
        System.out.println(interpolationSearch(315));
    }
}

5.斐波那契查找

5.1 斐波那契查找概述

斐波那契查找(Fibonacci Search)也是有序表的一种查找方式,同样属于二分查找的一个优化,它是利用了黄金分割原理(斐波那契数列)来实现的。改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=low+F(k-1)-1(F代表斐波那契数列)。

斐波那契数列:即1,1,2,3,5,8,13...,从第三个数开始,后面的数都等于前两个数之和,而斐波那契查找就是利用的斐波那契数列来实现查找的。初始化的斐波那契数列最后一位要大于等于数组元素的size-1。

查找步骤:

假设表中有 n 个元素,查找过程为获取区间的下标 mid=low + fibonacci[k - 1] - 1 ,对 mid 的关键字与给定值的关键字比较:

  • 如果与给定关键字相同,则查找成功,返回mid和high的最小值;
  • 如果给定关键字大,向右查找并减小2个斐波那契区间;
  • 如果给定关键字小,向左查找并减小1个斐波那契区间;
  • 重复过程,直到找到关键字(成功)或区间为空集(失败)。

5.2 斐波那契查找实现

public class FibonacciSearch {
    /**
     * 有序的数组
     */
    public int[] elements = new int[]{1, 16, 24, 35, 47, 59, 62, 73, 88, 99};
    /**
     * 对应的斐波拉契数组,数组的最大值>=elements.length-1
     */
    public int[] fibonacci = new int[]{1, 1, 2, 3, 5, 8, 13};

    @Test
    public void test1() {
        //3
        System.out.println(fibonacciSearch2(35));
    }

    /**
     * 斐波那契查找的实现
     *
     * @param key 要查找的数据
     * @return 查找到的索引, 或者-1 表示查找到
     */
    public int fibonacciSearch2(int key) {
        //最小索引
        int low = 0;
        //最大索引
        int high = elements.length - 1;
        //不在范围内,直接返回-1
        if (elements[low] > key || elements[high] < key) {
            return -1;
        }

        int k = 0, i, mid;
        /*计算high位于斐波那契数列的位置 */
        //这里high为9,fibonacci[5]<9<fibonacci[6] ,取大的,即k=6
        while (high > fibonacci[k]) {
            k++;
        }

        /*扩展数组*/
        //扩展原数组,长度扩展为fibonacci[k]=13,即多加了三个位置elements[10],elements[11],elements[12]
        elements = Arrays.copyOf(elements, fibonacci[k]);
        //为了保证数组的顺序,把扩展的值都设置为原始数组的最大值
        for (i = high + 1; i < elements.length; i++) {
            elements[i] = elements[high];
        }
        /*开始斐波那契查找*/
        while (low <= high) {
            /* 计算当前分隔的下标索引,取的是黄金分割点 7-4-2-1-0  7-10*/
            mid = low + fibonacci[k - 1] - 1;
            /* 若查找记录小于当前分隔记录 */
            if (key < elements[mid]) {
                /* 最高下标调整到分隔下标mid-1处 */
                high = mid - 1;
                /* 斐波那契数列下标减一位 */
                k = k - 1;
            }
            /* 若查找记录大于当前分隔记录 */
            else if (key > elements[mid]) {
                /* 最低下标调整到分隔下标mid+1处 */
                low = mid + 1;
                /* 斐波那契数列下标减两位 */
                k = k - 2;
            } else {
                /* 若mid <= high则说明mid即为查找到的位置,返回mid */
                /* 若mid>high说明是补全数值,返回high */
                return Math.min(mid, high);
            }
        }
        return -1;
    }

}

具体步骤

如果查找的key等于35:

  • 程序开始运行,数组elements={1,16,24,35,47,59,62,73,88,99},high =9,要查找的关键字key=35。注意此时我们已经有了事先计算好的全局变量数组fibonacci的具体数据,它是斐波那契数列,fibonacci ={1,1,2,3,5,8,13},计算原则是斐波那契数列的最大值是大于等于elements.length-1的最小值。
  • 计算high=9位于斐波那契数列的索引位置,可能是位于某两个索引位置之间,那么取最大的索引位置。fibonacci[5]<9<fibonacci[6] ,取大的,即k=6。
  • fibonacci[6]=13,计算时数组长度应该为13,因此我们需要对原数组elements扩展长度10至13,扩展后后面的索引位置均没有赋值,为了保证数组的有序,赋值为原素组elements的最大值elements[10]= elements[11]= elements[12]= elements[9]。
  • 然后开始斐波那契查找:

寻找mid下标,由于low=0且k=6,我们第一个要对比的数值是从下标为mid=0 + fibonacci[6 - 1] – 1 = 7开始的。

此时elements[7]=73>key=35,因此查找记录小于当前分隔记录;得到high=7-1=6,k=6-1=5。再次循环,计算mid=0+F[5-1]-1=4。

此时elements[4]=47>key=35,因此查找记录小于当前分隔记录;得到high=4-1=3,k=5-1=4。再次循环,mid=0+F[4-1]-1=2。

此时elements[2]=24<key=35,因此查找记录大于当前分隔记录;得到low=2+1=3,k=4-2=2。再次循环,mid=3+F[2-1]-1=3。

此时elements[3]=35<key=35,因此查找记录等于当前分隔记录;返回此时mid=3和high=3的最小值,斐波那契查找结束。即返回3

如果查找的key等于99:

前几步都是一样的,主要是斐波那契查找不一样:

寻找mid下标,由于low=0且k=6,我们第一个要对比的数值是从下标为mid=0 + fibonacci[6 - 1] – 1 = 7开始的。

此时elements[7]=73<key=99,因此查找记录大于当前分隔记录;得到low=7+1=8,k=6-2=4。再次循环,计算mid=8+F[4-1]-1=10。注意此时10的索引位置已经到了扩展的三个元素中了。

此时elements[10]=99=key=99,因此查找记录等于当前分隔记录;返回此时mid=10和high=9的最小值,斐波那契查找结束,即返回9。

这里可以看出来扩展数组的用意,因为mid有可能算出超出原数组索引长度的索引;同时也可以看出来最后还要比较取最小值的用意,因为扩展的元素只是我们比较时添加的,实际上原数组并不存在这个索引,因此要取high,即原数组存在的索引;同时这也是为扩展的元素赋值的用意,要保证mid有值-但是不超过最大值,因此就取最大值。

5.3 总结

如上图,斐波那契查找的特点就是左侧半区范围大于右侧半区范围。如果要查找的记录在mid右侧,则左侧的数据都不用再判断了,不断反复进行下去,对处于右侧当中的大部分数据,其工作效率要高一些。 所以尽管斐波那契查找的时间复杂也为O(logn),但就平均性能来说,斐波那契查找要优于二分查找。可惜如果是最坏情况,比如这里key=1,那么始终都处于左侧长半区在查找,则查找效率要低于二分查找。

还有比较关键的一点,二分查找是进行加法与除法运算(mid=(low+high)/2),插值查找进行复杂的四则运算(mid=low+(highlow)*(key-a[low])/(a[high]-a[low])),而斐波那契查找只是最简单加减法运算(mid=low+F[k-1]-1),在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率,但是斐波那契额查找同样需要额外的空间。

以上就是Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)的详细内容,更多关于Java查找算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进行移动 三.有序数组和无序数组共同优缺点 删除数据时必须把后面的数据向前移动来填补删除项的漏洞 四.代码实现 public class OrderArray { private int nElemes; //记录数组长度 private long[] a; /** * 构造函数里面初始化数组 赋值默

  • Java 二分查找算法的实现

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删

  • Java经典算法汇总之顺序查找(Sequential Search)

    a)原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b)图例说明: 原始数据:int[]a={4,6,2,8,1,9,0,3}; 要查找数字:8 找到数组中存在数据8,返回位置. 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg) { int[] a={4,6,2

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

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

  • Java实现的两种常见简单查找算法示例【快速查找与二分查找】

    本文实例讲述了Java实现的两种常见简单查找算法.分享给大家供大家参考,具体如下: 前言: 查找是指从一批记录当中找出满足制定条件的某一记录的过程. 在平常的程序的编写当中很多时候时用得上的,这里简单介绍两个查找算法 1. 快速查找: 这个是相当简单的,以数组举例,就用一个for循环去查找数组中需要查找的数据 例子: public static boolean quickSearch(int a[], int x) { boolean f = false; int length = a.leng

  • Java实现的快速查找算法示例

    本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位置,如果当前固定的数的位置和用户要找的第几个数匹配,则就直接返回.例如我要找第二大的数,如果循环一次固定的数的下标是1,那就是当前需要找的数. 代码如下: // 快速查找算法 public static int quickSelect(int[] arr, int selectIndex) { in

  • Java二分查找算法实现代码实例

    这篇文章主要介绍了Java二分查找算法实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 二分查找: 两种方式: 非递归方式和递归方式 主要思路: 对于已排序的数组(先假定是从小到大排序), 先定义两个"指针", 一个"指向"首元素low, 一个"指向"末尾元素high. 然后, 开始折半比较, 即让要查找的数与数组中间的元素(索引为 low+high/2)比较. 若要查找的数比中间数小

  • java 算法二分查找和折半查找

     java 算法二分查找与折半查找 折半查找 :首先数组是已经排好序的 实例代码: package com.hao.myrxjava; /** * 折半查找 :首先数组是已经排好序的 * * @author zhanghaohao * @date 2017/5/15 */ public class HalfDivision { /** * 循环实现 * * @param array 排好序的数组 * @param value 查找的值 * @return value在array的位置 */ pu

  • Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)

    目录 1.查找概述 2.顺序查找 3.二分查找 3.1 二分查找概述 3.2 二分查找实现 4.插值查找 4.1 插值查找概述 4.2 插值查找实现 5.斐波那契查找 5.1 斐波那契查找概述 5.2 斐波那契查找实现 5.3 总结 1.查找概述 查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表.查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合. 查找(Searching): 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

  • Java实现Floyd算法的示例代码

    目录 一 问题描述 二 代码 三 实现 一 问题描述 求节点0到节点2的最短路径. 二 代码 package graph.floyd; import java.util.Scanner; public class Floyd { static final int MaxVnum = 100; // 顶点数最大值 static final int INF = 0x3f3f3f3f; //无穷大 static final int dist[][] = new int[MaxVnum][MaxVnum

  • Java实现Dijkstra算法的示例代码

    目录 一 问题描述 二 实现 三 测试 一 问题描述 小明为位置1,求他到其他各顶点的距离. 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.Stack; public class Dijkstra { static final int MaxVnum = 100; // 顶点数最大值 static final int INF = 0x3f3f3f3f; //无穷大 static final int

  • Java实现雪花算法的示例代码

    一.介绍 SnowFlow算法是Twitter推出的分布式id生成算法,主要核心思想就是利用64bit的long类型的数字作为全局的id.在分布式系统中经常应用到,并且,在id中加入了时间戳的概念,基本上保持不重复,并且持续一种向上增加的方式. 在这64bit中,其中``第一个bit是不用的,然后用其中的41个bit作为毫秒数,用10bit作为工作机器id,12bit`作为序列号.具体如下图所示: 第一个部分:0,这个是个符号位,因为在二进制中第一个bit如果是1的话,那么都是负数,但是我们生成

  • Java实现抽奖算法的示例代码

    目录 一.题目描述 二.解题思路 三.代码详解 四.优化抽奖算法 解题思路 代码详解 一.题目描述 题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽一位幸运粉丝,送份小礼物.为了公平,要保证抽奖过程是随机的. 二.解题思路 1.把参与的人员加到集合中 2.使用Random对象获取随机数 3.把随机数当下标,获取集合中的幸运用户 三.代码详解 public class Basics28 { public static void main(String[] args) { List<

  • Java实现Kruskal算法的示例代码

    目录 介绍 一.构建后的图 二.代码 三.测试 介绍 构造最小生成树还有一种算法,即 Kruskal 算法:设图 G=(V,E)是无向连通带权图,V={1,2,...n};设最小生成树 T=(V,TE),该树的初始状态只有 n 个节点而无边的非连通图T=(V,{}),Kruskal 算法将这n 个节点看成 n 个孤立的连通分支.它首先将所有边都按权值从小到大排序,然后值要在 T 中选的边数不到 n-1,就做这样贪心选择:在边集 E 中选择权值最小的边(i,j),如果将边(i,j)加入集合 TE

  • Java实现折半插入排序算法的示例代码

    目录 排序算法介绍 折半插入排序 原理 代码实现 复杂度分析 算法实践 排序算法介绍 排序算法是通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.最终序列按照一定的规律进行呈现. 在排序算法中,稳定性和效率是我们经常要考虑的问题. 稳定性:稳定是指当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化. 复杂度分析: (1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量. (2)空

  • Java实现8种排序算法的示例代码

    冒泡排序 O(n2) 两个数比较大小,较大的数下沉,较小的数冒起来. public static void bubbleSort(int[] a) { //临时变量 int temp; //i是循环次数,也是冒泡的结果位置下标,5个数组循环5次 for (int i = 0; i < a.length; i++) { //从最后向前面两两对比,j是比较中下标大的值 for (int j = a.length - 1; j > i; j--) { //让小的数字排在前面 if (a[j] <

  • JAVA用递归实现全排列算法的示例代码

    求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现. 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件.以[1, 2]为例 首先展示一下主要代码(完整代码在后面),然后简述 //对数组array从索引为start到最后的元素进行全排列 public void perm(int[]array,int start) { if(start==array.length) { //出口条件 for(int i=0;i<array.length;i

随机推荐