网站开发语言用到,多说评论插件对网站优化,wordpress 面包屑导航修改,wordpress手机菜单导航代码一#xff0c;数组翻转
1.概述:数组对称索引位置上的元素互换#xff0c;最大值数组序号是数组长度减一
创建跳板temp#xff0c;进行min和max的互换#xff0c;然后min自增#xff0c;max自减#xff0c;当minmax的时候停止互换#xff0c;代表到中间值 用代码实…一数组翻转
1.概述:数组对称索引位置上的元素互换最大值数组序号是数组长度减一
创建跳板temp进行min和max的互换然后min自增max自减当minmax的时候停止互换代表到中间值 用代码实现
public class Demo01Reverse {public static void main(String[] args) {//定义一个静态数组 int arr [] {1,2,3,4,5,6,7};for(int min0,max arr.length-1;minmax;min,max--){//进行换位int temp arr[min];arr[min] arr[max];arr[max] temp;}for (int i 0; i arr.length; i) {System.out.print(arr[i] );}}
}
二冒泡排序 数组的排序是将数组中的元素按照大小进行排序默认都是以升序的形式进行排序数组排序的方法很多我们讲解的是数组的冒泡排序。 排序都要进行数组 元素大小的比较再进行位置的交换。冒泡排序法是采用数组中相邻元素进行比较换位。 arr[i](前一个元素) arr[i1](后一个元素)
比如以下数组
5 4 3 2 1
进行01号位的数字比较
4 5 3 2 1
然后又进行12号位的数字比较
4 3 5 2 1
然后23号位比较
4 3 2 5 1
最后34号位比较
4 3 2 1 5
实现位置的交换依然和前面数组翻转一样创建一个跳板temp进行交换
代码实现
首先定义数组
public class Demo02Bubble {public static void main(String[] args) {int[] arr {5,4,3,2,1};
进行第一轮冒泡
/* 第一圈 */for (int i 0; i arr.length; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}
测试出现警告 这是为什么呢
其实是循环的时候突破了数组的最大序号
因为arr.length就等于5所以i能取到的最大值是4所以i15突破了最大限制
改为arr.length-1 成功然后进行第二圈
//第二圈for (int i 0; i arr.length-1; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}
第二圈代码和第一圈一样也没问题但也和第一圈一样比较了4次但我们可以不必做这个重复功因为第一次比较完了一个数所以我们可以减去一次循环来表示可以少比较的次数所以可以写成arr.length-1-1最后面减的这个数可以看成是前面冒泡过的数的个数圈数
//第二圈for (int i 0; i arr.length-1-1; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}
现在进行第三圈第四圈同样我们减去前面冒泡过的数的个数
//第三圈for (int i 0; i arr.length-1-2; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}//第四圈for (int i 0; i arr.length-1-3; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}
运行结果 但我们可以再进行优化这几圈的变化非常细微只有一个数一个位置在变
如果最后面减的数是前面的圈数的话那也就等于i啊我们可以再在外面套一层循环利用自加i来代替这几圈唯一变的减数
/*
外层循环代表比较了几圈n-1圈
*/for (int j 0; j arr.length-1; j) {for (int i 0; i arr.length-1-j; i) {/*内层循环代表每一圈比较的次数每圈都少比较一次*/if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}}
由此而来化繁为简减小了时间空间复杂度
完整代码如下
public class Demo02Bubble {public static void main(String[] args) {int[] arr {5,4,3,2,1};/*第一圈越界原因:当i变化到4的时候- arr[4]arr[5] - 直接操作了5索引,所以越界了越界解决:我们可以让arr.length-1如果arr.length-1- 比较就是i4 - 此时i最大可以变化到3当i变化到3时 - arr[3]arr[4] - 正好是最后两个元素进行比较*/for (int i 0; i arr.length-1-0; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}//第二圈/*for (int i 0; i arr.length-1-1; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}*///第三圈/*for (int i 0; i arr.length-1-2; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}*///第四圈/*for (int i 0; i arr.length-1-3; i) {if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}*//*外层循环代表比较了几圈n-1圈*/for (int j 0; j arr.length-1; j) {for (int i 0; i arr.length-1-j; i) {/*内层循环代表每一圈比较的次数每圈都少比较一次*/if(arr[i]arr[i1]){int temp arr[i];arr[i] arr [i1];arr[i1] temp;}}}for (int i 0; i arr.length; i) {System.out.print(arr[i] );}}
}
三二分查找一尺之锤日取其半万世不竭
1.前提:数组中的数据必须是有序的 2.查询思想: a.老式查询:遍历数组,一个一个比较 - 查询效率慢 b.二分查找:每次找中间索引对应的元素进行比较查询(每一次查询少一半数据) 首先因为min和max会因为查找数所在数组的位置不同而改变所以不能定义min就是arr[0]或max就是arr[8]min默认为0max为arr.length-1mid就是二者取中。
key为查询数是指想查的数组中的数查询出的是数组序数代表 含的数。
前提当minmax时
当查询数大于或小于数组序数上所代表的数时通过移动min和max直接排掉一半的数来不断的锁定范围直到找到查询数所在的位置这个方法很像一尺之锤日取其半万世不竭不过是有目标的取当查询数等于数组序数上所代表的数时停止查找返回序数表示找到了。
当然还有特殊情况就是查询数不存在在数组中那么当minmax时就不找了返回-1表示找不到。
代码实现
public static int binary(int[] arr,int data){//定义三个变量分别代表最大索引,最小索引,中间索引int min 0;int max arr.length-1;int mid 0;//查找while (minmax){mid (minmax)/2;if(dataarr[mid]){min mid1;}else if(dataarr[mid]){max mid-1;}else{return mid;}}return -1;}
我们发现代码实现和理论方法步骤不同没有在一开始表示mid (minmax)/2,因为要循环的算中间索引在一进入循环时在while外层循环内再进行计算。
在main函数内调用方法进行输出完整代码如下
public class Demo03Binary {public static void main(String[] args) {int[] arr {1,2,3,4,5,6,7,8,9};int index binary(arr, 7);System.out.println(index);}public static int binary(int[] arr,int data){//定义三个变量分别代表最大索引,最小索引,中间索引int min 0;int max arr.length-1;int mid 0;//查找while (minmax){mid (minmax)/2;if(dataarr[mid]){min mid1;}else if(dataarr[mid]){max mid-1;}else{return mid;}}return -1;}
}
输入7