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

来源:互联网 发布:要怎么注销淘宝账号 编辑:程序博客网 时间:2024/06/14 01:11

------- android培训、java培训、期待与您交流! ----------

一、数组排序

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

A,选择排序

画个图来便于理解

 

 

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

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

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

总结规律:

        外层循环:控制轮数 从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。此时我们比较18arr[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]) {//如果查找的数比中间的数小,就向小查找,让最大的索引变为中间索引-1if(number<arr[mid]) {end = mid-1;}else if(number>arr[mid]) {//如果查找的数比中间的数大,就向大查找,让最小的索引变为中间索引+1start = mid+1;}//如果出现大索引的值小于小索引,就说明不存在该元素,返回-1if(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;}}}} }

 

 

关于排序与查找,我的总结就是想理解他们的思想,具体的思想过程是什么,然后再去敲代码,这样会更容易掌握。

0 0
原创粉丝点击