您的位置:首页 > 职场人生

黑马程序员03数组排序与二分法查找

2015-08-20 23:25 627 查看
------- android培训java培训、期待与您交流! ----------

一、数组排序

关于数组排序,常见的有两种,一是选择排序,二是冒泡排序,下面分别来介绍这两种排序方法。

A,选择排序

画个图来便于理解

 


 

首先我们定义一个数组,int[] arr = new int[]{43,23,74,4,27},首先,我们把数组中的第一个元素依次的与其他元素进行比较,定义中的数组第一个元素是43,第二个是23,如果第一个元素大于第二个元素,则交换他们的位置,此时43与23交换位置,然后再拿第一个元素与第三个元素之间进行比较,同理,如果第一个元素大于第三个元素,则交换他们的位置,不断的如此进行比较,知道与最后一个元素进行比较,此时我们得到的第一个元素即为数组中的最小值。

接着,我们把数组中第二个元素依次与数组中其他元素进行比较,直到比较完,数组中最后一个元素,此时我们得到数组中第二小的元素。

如上,我们把第三个元素依次与数组中元素进行比较.........直到最后一次比较为止。

总结规律:

        外层循环:控制轮数 从0开始到length-1结束

 内层循环:控制一轮中比较的次数 从轮数+1开始到length轮数结束

 

package cn.itcast2;
/*
* 选择排序:
*  使用每一个元素,与其他元素依次比较
* 外层循环:控制轮数
*    从0开始到length-1结束
* 内层循环:控制一轮中比较的次数
*           从轮数+1开始到length轮数结束
*/
public class Demo02_Select {

public static void main(String[] args) {

int[] arr = new int[]{43,23,74,4,27};
for(int i=0; i<arr.length-1; i++) {
for(int j=i+1; j<arr.length; j++) {
if(arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
int j = arr[i];
System.out.print(j+" ");
}
}
}


 

 

 

 

B,冒泡排序

同样作图理解

 


同样的数组,冒泡排序主要是让相邻的两个元素之间进行比较,此时,比较第一个元素和第二个元素进行比较,如果第一个元素大于第二个元素,则交换他们的位置,接着将第二个元素与第三个元素之间进行比较,如果第二个元素大于第三个元素,则交换他们的位置,以此类推,知道最后两个元素比较完成,此时我们发现最大值已经排列完成。

接着依旧,相邻两个元素进行比较排序,此时我们比第一次少比较了一次,并且获取了,第二大的值。

如上方法,依次进行,知道最后一次前两个元素进行比较排序。

 

总结规律:

 外层循环:控制轮数  从0开始到length-1结束

 内层循环:控制一轮中比较的次数  从0开始到length-1-轮数结束

 

代码如下:

<pre name="code" class="java">package cn.itcast2;
/*
* 冒泡排序:
* 		使用相邻的两个元素依次比较
* 外层循环:控制轮数
* 	  从0开始到length-1结束
* 内层循环:控制一轮中比较的次数
* 	         从0开始到length-1-轮数结束
*/
public class Demo01_Bubble {

public static void main(String[] args) {

int[] arr = new int[]{43,23,74,4,27};

for(int i=0;i<arr.length-1; i++) {
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}

for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}




***********

对于排序,实际开发过程中直接使用的是Arrays.sort(arr)。记得第一次直接使用的时候报错了,系统提示错误,找不到符号,后来发现是忘记导包import java.util.Arrays;

***********

 

二、二分法查找元素位置

作图理解:



 

 

二分查找法的前提首先数组必须是有序的,所以在进行二分查找之前我们需要对数组进行一个排序。依次将数据与中间数据进行比较。

排序完成后如图所示

假设我们此时需要索引18所在的数组的位置,此时我们定义三个变量,定义start(第一个元素脚标)为0,定义end(最后一个元素脚标)为arr.length-1,

定义mid(中间元素脚标)为(start+end)/2。此时我们比较18与arr[mid]

的大小,此时18比中间数要小,所以此时向小查找,让最大的索引变为中 间索引-1。重复如上步骤,直到找到该元素所在数组的位置。

但是如果数组中没有这个元素,此时,当start>end时,则return-1;

 

 

package cn.itcast2;
/*
* 返回这个数组中18的索引是多少
*
* 二分法查找:
*  数组必须排序
*  依次将所查找数据与中心数据对比,根据大小调整数据边界
*/
public class Demo03_BinarySearch {

public static void main(String[] args) {

//定义要查找内容的数组
int[] arr = new int[]{43,23,74,4,27,100,18};
//使用二分法查找,数组必须排序
sort(arr);
//观察数组,看看其中所有排好序的元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println("========");
//调用二分法查找方法,并打印方法返回的索引
System.out.println(binarySearch(arr,50));
}
public static int binarySearch(int[] arr,int number) {
//定义三个变量分别记录三个索引
int start = 0;
int end = arr.length-1;
int mid = (start+end)/2;
//只要给定的数与中间的数不同,就开始循环
while(number!=arr[mid]) {
//如果查找的数比中间的数小,就向小查找,让最大的索引变为中间索引-1
if(number<arr[mid]) {
end = mid-1;
}else if(number>arr[mid]) {//如果查找的数比中间的数大,就向大查找,让最小的索引变为中间索引+1
start = mid+1;
}
//如果出现大索引的值小于小索引,就说明不存在该元素,返回-1
if(start>end) {
return -1;
}
//每次变更数据边界后,中间索引的位置要随之改变
mid = (start+end)/2;
}
//如果给定的数与中间的数相同,就返回中间的索引
return mid;
}

public static void sort(int[] arr) {
for(int i=0;i<arr.length-1; i++) {
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}

}


 

 

关于排序与查找,我的总结就是想理解他们的思想,具体的思想过程是什么,然后再去敲代码,这样会更容易掌握。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 冒泡排序