黑马程序员03数组排序与二分法查找
来源:互联网 发布:要怎么注销淘宝账号 编辑:程序博客网 时间:2024/06/14 01:11
------- 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]) {//如果查找的数比中间的数小,就向小查找,让最大的索引变为中间索引-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;}}}} }
关于排序与查找,我的总结就是想理解他们的思想,具体的思想过程是什么,然后再去敲代码,这样会更容易掌握。
- 黑马程序员03数组排序与二分法查找
- 黑马程序员--选择排序、冒泡排序、二分法查找
- 黑马程序员————二分法查找数组
- 黑马程序员 java基础 函数 数组 查找与排序总结
- 黑马程序员---数组的学习,定义规范,排序与查找
- 黑马程序员----排序与查找
- 二分法查找与排序
- 黑马程序员-day04数组排序,查找
- 黑马程序员----实用的数组排序查找
- 黑马程序员_java数组排序、查找、置换
- 黑马程序员:Java数组简介与数组的应用:选择排序、冒泡排序、折半查找
- 黑马程序员————冒泡排序、选择排序、二分法查找
- 黑马程序员-冒泡排序、直接排序、二分法
- 二分法递归查找与二分法查找,随机数产生,冒泡排序
- [源码]排序数组二分法(折半)查找
- 黑马程序员_数组与排序
- 黑马程序员_数组及其排序查找操作
- 黑马程序员--05JAVA数组及其排序和查找
- iOS系统和XCode各版本发布日期
- HTML5 drag的使用案例 --- 类似于图片墙
- FatMouse's Speed
- js: 实现Select的option上下移动
- Timber
- 黑马程序员03数组排序与二分法查找
- MyBatis拦截器实现mysql与oracle共用分页
- Android内存分析工具(四):adb命令
- 【面试题之算法部分】最长回文子串
- ural 1272. Non-Yekaterinburg Subway
- Spring拦截器中通过request获取到该请求对应Controller中的method对象
- WebService为什么不如RESTful API流行
- MySQL数据库默认编码查看/修改
- Opencv图像显示