Java冒泡排序和二分查找(预习)

经查阅,将资料整理如下:

一、冒泡排序

1、算法简介

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

2、算法原理

(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

(3)针对所有的元素重复以上的步骤,除了最后一个。

(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3、算法分析

(1)时间复杂度

(2)算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

4、算法描述

二、二分查找

1、算法简介

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

2、算法要求

(1)必须采用顺序存储结构

(2)必须按关键字大小有序排列

3、算法复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

时间复杂度无非就是while循环的次数!

总共有n个元素,

渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数

由于你n/2^k取整后>=1

即令n/2^k=1

可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O()=O(logn)

4、代码示例

时间: 2024-10-25 02:01:06

Java冒泡排序和二分查找(预习)的相关文章

选择、冒泡排序,二分查找法以及一些for循环的灵活运用

import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] array = { 31, 22, 15, 77, 52, 32, 18, 25, 16, 7 }; // 冒泡 --> 两两比较 --> 提取出最大的数 在最后一位 //拿第一位和它后面的一位进行 两两比较 System.out.println(Arrays.toString(array)); fo

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆) 虽然直接插入排序,冒泡排序以及二分查找是算法中最为基础以及老掉牙的话题,但作为一名算法的深爱者,有时候无聊时候总会将这些简单的话题重新理解并敲写一番,目的只是为了得到理解娴熟的程度.而且,我觉得越是简单基础的东西,有时候更应该反复的去敲写,深化它,并最终让其中的思想内化为自己的一部分.待到他日一提起之时,会相当娴熟的"刷刷刷..."几分钟搞定,那就很有成就感了! 因为我喜欢对于一个问题进行实例的剖析,进而再转化为特有的用某种

关于数组的几个小题目-冒泡排序、二分查找、直接选择排序、反转数组

1. 实现冒泡排序算法,对比相邻元素,如果满足条件就叫唤元素值,把较小的元素移动到数组前面,把较大的元素移动到数组的后面,这样较小的元素就逐渐从底部上升到顶部,排到前面了. public class zuoye14_maopaopaixu { public static void main(String[] args){ int[] array = new int[]{12,45,21,35,65,24,43}; for(int i=0;i<array.length;i++){ for(int

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai

冒泡排序、二分查找法

冒泡排序的基本思想是对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部. 1 package com.hanqi; 2 3 public class maopao { 4 5 public static void main(String[] args) { 6 int[]array=new int[]{63,4,24,1,3,13}; 7 System.out.println("冒

【C/C++】冒泡排序与二分查找

冒泡排序:就是相邻两个数进行比较,如果a>b(或者a<b)则交换值,每次把一个最大(或者最小)的值往后推. 二分查找:每次取头和尾的中间下标的值a与目标值b进行比较,如果a>b表示目标值b在中间下标前面,把头指向中间下标的前一位:如果a<b表示目标值b在是中间下标后面,把尾指向中间下标的后一位:如果a==b则返回中间下标.查找失败返回-1. 1.随机初始化一个指定长度的数组. 2.对数组进行排序. 3.输入一个值,并查找该值在数组中的下标.

java数组排序,二分查找

public static void main(String[] args) { int[] a = { 5, 1, 10, 3, 8, 0 }; for (int i = 0; i < selectionSort(a).length; i++) { System.out.println(selectionSort(a)[i]); } System.out.println("-------------------------"); for (int i = 0; i < b

js基本算法:冒泡排序,二分查找

知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡排序 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较. 1 function sort(elements){ 2 for(v

Java集合中二分查找算法实现

Arrays.binarySearch实现了对有序数组特定区间的二分查找,虽然我们觉得很简单,但是阅读源码的确能看到实现这些库的优秀技巧,总是在追求完美和高效. 值得学习的地方有: (1)边界检查: (2)求中位数的时候使用位移操作,而不是 x/2; (3)如果查找的元素不在数组中,通过返回值昭示了应该插入的位置,而不是直接返回-1: public static int binarySearch(int[] a, int fromIndex, int toIndex, int key) { ra