查找排序算法汇总

摘要:

插入排序分为三种:

  • 直接插入排序

    基本思想就是挨个遍历,第二个元素和第一个比,第三个元素和前两个比,第四个和前三个比,如果合适就移动后面的元素,插入当前元素

  • 二分插入排序

    基于二分查找算法的思想,不挨个比,每次找中间数进行比较,如果合适就移动后面的元素,插入当前元素

  • 希尔排序

    希尔排序适用大规模且无序的数据,上述两种适合小规模且有序的数据。

    希尔排序的核心思想是分组,根据增量序列分组排序,避免大规模的数据遍历比较。

交换排序分为两种:

  • 冒泡排序

    比较相邻的元素,如果第一个比第二个大,元素交换

  • 快速排序

    递归思想:取一个基准数进行左右分区,将数组中大于基准数的放在右边,小于基准数的放在左边。

    对于左右分区,采取相同的策略,选取基准数,分区,直到单个分区中只有一个数。

选择排序分为两种:

  • 直接选择排序

    选出数组中最小的元素,放在序列起始位置,然后在剩余元素中选取最小的数据,以此类推。

  • 堆排序

    堆排序核心思想是利用数组的索引映射称为堆的数据结构(近似二叉树)。

一,查找算法

常见查找算法分为七种:

  • 顺序查找

  • 二分查找

  • 插值查找

  • 查找树

  • 分块查找

  • 哈希查找


顺序查找

顺序查找适合于存储结构为顺序存储或链接存储的线性表。

从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。【挨个遍历】

时间复杂度和空间复杂度都为O(n)。

/**
         * 顺序查找  45
         */
        int x[]=new int[]{1,3,5,6,8,9,45,56,78,86,95};

        for (int i =0 ;i<x.length;i++)
        {
            System.out.println("第"+(i+1)+"次查找");
            if(x[i]==45)
            {
                System.out.println(x[i]+"   查找成功!");
                break;
            }
            System.out.println(x[i]);
        }

1570609123946


二分查找

前提:元素必须是有序的。

基本思想:用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

时间复杂度为O(log2n)

/**
         * 二分查找  45
         */
        int x[]=new int[]{1,3,5,6,8,9,45,56,78,86,95};

        int low = 0;
        int high = x.length;
        int mid;
        int count=1;

        while(low<high)
        {

            mid=(int)(low+high)/2;

            System.out.println("第"+count+"次查找"+",比较值为"+x[mid]);

            if(x[mid]<45)
            {
                low=mid+1;
                System.out.println("查找结果: 值偏小");
            }
            else if(x[mid]>45)
            {
                high=mid-1;
                System.out.println("查找结果: 值偏大");
            }
            else
            {
                System.out.println("查找成功");
                break;
            }
            count++;
        }

1570610521790


插值查找

二分查找的优化版本,将查找点从固定的二分改为自适应,提高查找效率。

mid = low + (key - a[low]) / (a[high] - a[low]) * (high - low)

时间复杂度为O(log2(log2n))

package com.company;

public class Al
{
    public static void main(String[] args){
        /**
         * 插值查找  45
         */
        int x[]=new int[]{1,3,
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值