再谈数组

在这一篇中我们来讲一下关于数组的排序和查找的方法。

排序

说到数组的排序,就不得不说冒泡这种经典的方法。

1.冒泡排序

冒泡排序的基本思想是比较两个相邻元素的值,如果满足条件就交换元素的值(如果是升序,就将较大的值放在索引大的引用内,较小的值放在索引小的引用内;降序的话反之),这样一次循环后最大或最小的值就会转移到数组的最后的位置,经过多次循环后数组就会按要求排好。

具体算法如下(以升序为例):

    publicstaticvoid swap(int[] array)

{

boolean a = false;

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

{

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

{

if(array[j]>array[j+1])

{

int t= array[j];

array[j]= array[j+1];

array[j+1]= t;

a =true;

}

}

if(!a)

{

return;

}

}

}

在这个方法中我们一共用了两层循环,内层循环是用来使最大的一个数移到数组的最后的位置,第二次把大二大的数移到数组倒数第二的位置,第一次循环是用来决定第二层循环一共需要循环多少次,外层循环每循环一次,内层循环就会少个需要比较的元素,这个元素就是我们上一次内层循环放到后面的数组元素值。

在这个方法中我还定义了一个布尔类型的变量,主要是用来提高程序的效率,如果某次内层循环一次交换也没有,说明当前数组的顺序已经满足要求了,没有必要进行后面的循环了,跳出即可。

冒泡排序我们就将这么多,我们来介绍另一种排序方式。

2.交换排序

这种排序是将每一个元素都与第一个元素进行比较,只要比第一个元素小就交换,最后就会将最小的元素放到第一个位置。在将后面的元素与第二个元素进行比较交换,同理第二小的元素就会放到第二个位置。以此类推,将数组元素顺序排好。具体算法如下(以升序为例):

    publicstaticvoidswapOne(int[] array)

{

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

{

for(int j = i+1 ;j<array.length;j++)

{

if(array[i]>array[j])

{

int t = array[j];

array[j] = array[i];

array[i] = t;

}

}

}

}

在这种方法中也是用到了两层循环,内层循环是将要比较的元素与后面的元素依次进行比较,不符合条件就交换,实现最小的或最大的放到最前面。外层循环的次数是和数组元素的个数减一一样,因为有几个元素就需要把几个元素减一放到前面。这个描述起来可能不太好理解,大家可以根据程序来理解一下。

3.选择排序

选择排序的思想是将所有的数先就行比较,但不进行交换,只是将最大的进行标记,比较完后,将被标记的元素放到最后,然后进行下一次寻找,最后将数组元素的顺序排好。具体算法如下(以升序为例):

     publicstaticvoidswapTwo(int[] array)

{

int k ;

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

{

k =0;

for(int j= 0; j<array.length-i;j++)

{

if(array[j]>array[k])

{

k =j;

}

}

int t= array[array.length - i-1];

array[array.length - i-1] = array[k];

array[k]= t;

}

}

这个方法的思路还是比较清晰的,需要注意的是用来标记的变量需要在每次外循环开始的时候清零,别的我就不多说了,下面来说说查找。

查找

最简单的查找一个数组中是否有某个元素的方法就是一个一个元素的与目标值进行比较,实现方法非常的简单,而且会大量浪费程序运行的时间,所以我们并不推荐使用。下面我来讲一下我们最常用的查找方法:二分法。

二分法

要想使用二分法是有一个前提条件的,就是数组必须是有序的。这与他的实现思路有关,他是这样实现的,先讲数组的最中间的元素的值与目标值进行比较,相等返回索引,大于目标值就将前半段的中间元素的值与目标元素进行比较,大、小于目标值就将后半段的中间元素的值与目标元素进行比较。以此类推,如果直到最后都没有,则就是没有找到目标值。具体算法如下:

publicstaticintcompare(int[] array,int i)

{

int low = 0;

int high = array.length;

int j = (low+high)/2;

while(low<=high)

{

if(array[j]== i)

{

return j;

}

else if(array[j]>i)

{

high = j-1;

j = (high+low)/2;

}

else

{

low = j+1;

j = (high + low)/2;

}

}

return -1;

}

在这个方法中变量low表示是还未进行比较的部分的最小的索引值,同理high表示最大的索引值,每一次循环都会改变low或high的值来进行下一次比较,直到找到该元素,或low>high。这个方法还是比较好理解的,我就说这么多吧。

初学者学Java(十五)的更多相关文章

  1. 没有基础的初学者学java怎样快速入门?超全的学习路线图

    现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...

  2. java十五个常用类学习及方法举例

    <code class="language-java">import java.util.Scanner; import java.util.Properties; i ...

  3. 初学者学Java常遇到的问题,我都给你回答了!

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 春节在家刷知乎,看到了一个知乎的问题:<学 ...

  4. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

  5. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  6. Java从零开始学三十五(JAVA IO- 字节流)

    一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...

  7. Java从零开始学二十五(枚举定义和简单使用)

    一.枚举 枚举是指由一组固定的常量组成的类型,表示特定的数据集合,只是在这个数据集合定义时,所有可能的值都是已知的. 枚举常量的名称建议大写. 枚举常量就是枚举的静态字段,枚举常量之间使用逗号隔开. ...

  8. 学JAVA第五天,今天困得要死

    好不容易坚持到第五天了,继续继续!!! 今天老师没有讲JAVA的for循环,倒是讲了HTML的相关内容: 讲了JAVA代码怎么在HTML中运行. 只要在HTML加入这个 background-colo ...

  9. 菜鸟学Java(五)——JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

随机推荐

  1. Css简介

  2. Unique Binary Search Tree

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  3. 利用js加载本地图片预览功能

    直接上代码: 经测试,除safari6包括6以下不支持,其他均可正常显示. 原因:safari6不支持filereader,同时不能使用IE滤镜导致失效. fix: 可以利用canvas,解决safa ...

  4. 动态内存分配(new)和释放(delete)

    在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了.但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入 ...

  5. 理解O/R Mapping

    本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型 ...

  6. traceroute命令

    traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置. 通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次 ...

  7. c# 重新认识 Double 浮点型

    double test1 = 0; for (int i = 0; i < 100000000; i++) { test1 += 0.0001; } 请问 test1 的值是几? 答案是:999 ...

  8. iOS8之后CoreLocation定位的使用

    在Info.plist文件中添加如下配置: //始终允许访问位置信息 (1)NSLocationAlwaysUsageDescription //使用应用程序期间允许访问位置数据 (2)NSLocat ...

  9. 基于OSGi的企业级快速开发平台(开源)

    模块化.插件化是未来的主流趋势,他很好的解决了,公司知识的积累.应用分发.商务模式.快速构建等一系列问题,国外著名的插件化平台JIRA就非常成功,国内的目前很多公司在偿试插件化的开发模式,作为平台推出 ...

  10. Java中new关键字和newInstance方法的区别

    在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法一个是关键字外,最主要的区别是创建对象的方式不同.newInstance()使用类加载机制,new是创建一 ...