几个基本算法(二分查找、冒泡排序、插入排序、快速排序、希尔排序)

本文详细介绍了递归实现的二分查找算法,以及冒泡排序、插入排序和快速排序的原理与实现,展示了Java中常用的基本排序算法和分治策略的应用。
摘要由CSDN通过智能技术生成

int temp;

while(l<=h) {

int mid=(l+h)/2; //中间位置

if(r<a[mid]) { //向左寻找

h=mid-1;

}else if(r>a[mid]) { //向右寻找

l=mid+1;

}else if(r==a[mid]) {

return mid+1; //返回值是数组的第几个数

}

}

return -1; //未查到

}

}

递归实现

static int binSearch(int [] a,int low,int high,int r){

int mid=(low+high)/2;

if(low>high){

return -1;

}else if (r==a[mid]){

return mid;

}else if(r<a[mid]){

return binSearch(a, low, mid-1, r); //向左

}else if(r>a[mid]){

return binSearch(a, mid+1, high, r); //向右

}

return -1;

}

冒泡排序

=====================================================================

冒泡排序的原理是循环遍历要排序的数列,每次遍历,从后往前比较两个相邻的数大小,如果前一个数比后一个数大的话,就交换两个数的位置,这样一来,最大的数就到了队列的后面,所以被称为冒泡排序。

一个数列{20,40,30,10,60,50}排序过程如下图:

在这里插入图片描述

实现:

public class BubbleSort {

/*冒泡排序:

  • 比较前后两个相邻的数据,如果前面的数据大于后面的数据,就将两个数据作交换

*遍历一遍之后,就将最大的数据沉到了最后面

*/

public static void main(String[] args) {

int []a= {8,5,9,4,3,6};

int []n =bubbleSort(a);

for (int i = 0; i < n.length; i++) {

System.out.print(a[i]+“\t”);

}

}

static int [] bubbleSort(int [] a) {

for(int i=0;i<a.length-1;i++) {

for(int j=0;j<a.length-1-i;j++) {

if(a[j]>a[j+1]) {

int temp=a[j+1];

a[j+1]=a[j];

a[j]=temp;

}

}

}

return a;

}

}

插入排序

=====================================================================

原理:通过构建有序数列,对于未排序数列,从后往前扫描,取出,和有序数列对比,插入到相应的位置。

一个数列{20,40,30,10,60,50}排序过程如下图:

在这里插入图片描述

实现:

public class InsertSort {

/*插入排序:

  • 假设有一组无序序列 R0, R1, … , RN-1。

(1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

(2) 然后,我们要依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,

我们需要一个外部循环,从下标 1 扫描到 N-1 。

(3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。

由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。

*/

public static void main(String[] args) {

int []a= {4,7,5,3,8,6};

for (int i : insertSort(a)) {

System.out.print(i+“\t”);

}

}

public static int [] insertSort(int [] arr) {

for(int i=1;i<arr.length;i++) { //第一个数视为有序,所以从第二个数开始

int j=0;

int insertVal=arr[i]; //取下标为i的数,和前面的有序数作比较,插入适当位置

//因为前i-1个数都是从小到大的有序序列,所以只要当前比较的数(a[j])比insertVal大,就把这个数后移一位

for(j=i-1;j>=0&&insertVal<arr[j];j–) {

arr[j+1]=arr[j];

}

arr[j+1]=insertVal;

}

return arr;

}

}

快速排序

=====================================================================

原理:快速排序采用分治的策略,选择一个基准值,比基准值小的都在左边序列,比基准值大的都在右边序列。·

一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有

继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比

较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的

值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值

来说,左右两边就是有序的了。

觉得参考【4】的说法更好理解,快速排序就是挖萝卜,填萝卜的过程。

在这里插入图片描述

实现

/*

快速排序:

基本方法:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

步骤:

1、选取一个基准数

2、从后往前比较,没有继续找,找到比基准数小的就交换位置

3、找到比基准数小的数以后,从前往后比较,找到比基准数大的就交换位置

4、重复执行2、3两步

*/

public class QuickSort {

public static void main(String[] args) {

int [] a={3,5,2,8,5,4,12,9,7};

sort(a,0,a.length-1);

for (int i = 0; i <a.length ; i++) {

System.out.print(a[i]+“\t”);

}

}

public static void sort(int []a,int low,int high){

int start = low;

int end = high;

int key = a[low]; //选择基准值

while(end>start){

//从后往前比较

while(end>start&&a[end]>=key)

//如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较

end–;

if(a[end]<=key){

int temp = a[end];

a[end] = a[start];

a[start] = temp;

}

//从前往后比较

while(end>start&&a[start]<=key)

//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置

start++;

if(a[start]>=key){

int temp = a[start];

a[start] = a[end];

a[end] = temp;

}

//此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的

//值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用

}

//递归

if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1

if(end<high) sort(a,end+1,high);//右边序列。从关键值索引+1 到最后一个

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中…(img-5obgpCJA-1713536139150)]

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值