再谈数组

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

排序

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

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. IIS7、IIS6 web.config注册HttpModule

    IIS6注册HttpModule <system.web>     <httpModules>       <add name="..." type= ...

  2. memset 初始化数组

    memset是初始化一段内存区域的函数,其头文件是<string.h>,以前经常使用出现错误,整理一下. C++ Reference对于memset的定义为: void * memset ...

  3. 初学Javascript对象

    <script> var p=new Object(); //属性 p.width=; p.height=; p.num=; p.autotime=; //方法 p.autoplay=fu ...

  4. eval("("+json对象+")")

    var obj=eval("("+data+")"); 看看下面这条,应该能想到json的数据结构“+(json对象名)+”由于json是以”{}”的方式来开始 ...

  5. Nginx源码研究四:NGINX的内存管理

    关于nginx的内存使用,我们先看代码,下面是nginx_cycle.c中对全局数据结构cycle的初始化过程 pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, ...

  6. 关于 wait_event_interruptible() 和 wake_up()的使用

    来源:http://blog.csdn.net/allen6268198/article/details/8112551 1. 关于 wait_event_interruptible() 和 wake ...

  7. ARM9的MMU

    一 页表 1. 页表是放置在RAM(一般为DRAM)中的一个数据段. 2. ARM的地址空间为2^32字节,即4G字节. 3. 一级页表总共有4096条记录,每条记录对应的地址块为1M,一级页表中的记 ...

  8. Swift互用性: 使用Objective-C特性编写Swift类(Swift 2.0版)-b

    本节包括内容: 继承Objective-C的类(Inheriting from Objective-C Classes) 采用协议(Adopting Protocols) 编写构造器和析构器(Writ ...

  9. html5 本地存储

    < ![CDATA[ 1. html本地存储操作 首先引用 <script src="Scripts/jquery-2.0.0.js"></script&g ...

  10. ISO14443协议中,卡片对RATS,PPS,IBLOCK的处理约定

    这几天总是看到有人因为这几条规则没处理好,结果检测时通不过,其实看看最新版的ISO14443协议就明白了. 协议中明确要求几条: 1.在激活状态后,如果收到一个无错的RATS命令后,卡片返回atr,此 ...