摘要:
插入排序分为三种:
-
直接插入排序
基本思想就是挨个遍历,第二个元素和第一个比,第三个元素和前两个比,第四个和前三个比,如果合适就移动后面的元素,插入当前元素
-
二分插入排序
基于二分查找算法的思想,不挨个比,每次找中间数进行比较,如果合适就移动后面的元素,插入当前元素
-
希尔排序
希尔排序适用大规模且无序的数据,上述两种适合小规模且有序的数据。
希尔排序的核心思想是分组,根据增量序列分组排序,避免大规模的数据遍历比较。
交换排序分为两种:
-
冒泡排序
比较相邻的元素,如果第一个比第二个大,元素交换
-
快速排序
递归思想:取一个基准数进行左右分区,将数组中大于基准数的放在右边,小于基准数的放在左边。
对于左右分区,采取相同的策略,选取基准数,分区,直到单个分区中只有一个数。
选择排序分为两种:
-
直接选择排序
选出数组中最小的元素,放在序列起始位置,然后在剩余元素中选取最小的数据,以此类推。
-
堆排序
堆排序核心思想是利用数组的索引映射称为堆的数据结构(近似二叉树)。
一,查找算法
常见查找算法分为七种:
-
顺序查找
-
二分查找
-
插值查找
-
查找树
-
分块查找
-
哈希查找
顺序查找
顺序查找适合于存储结构为顺序存储或链接存储的线性表。
从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值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]);
}
二分查找
前提:元素必须是有序的。
基本思想:用给定值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++;
}
插值查找
二分查找的优化版本,将查找点从固定的二分改为自适应,提高查找效率。
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,