本文将带你了解选择排序、冒泡排序以及二分查找法的原理和代码实现,以及通过Arrays类快速实现对数组的一些操作
一、选择排序
选择排序是从第一个数开始,依次与所有的数相比较,把最大(降序)/最小(升序)的数放到第一个位置上,然后再将第二个数与除第一个数以外的数相比较,把最大(降序)/最小(升序)的数放到第二个位置上,依次类推一直到倒数第二个数结束为止,理解来说就是跟体育课老师按照身高的大小排队列一样,总是把最高的或者最矮的放在最前面
将数组中的元素按降序排列实现代码如下:
int [] arr = {3,5,56,73,43,108,89,7,27};
for(int i = 0 ;i < arr.length - 1; i++){
for(int j = i ;j < arr.length; j++){
if(arr[i] < arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
//输出结果为[108, 89, 73, 56, 43, 27, 7, 5, 3];
需要的注意问题:
1.外层循环控制的是比较的次数,同时变量的初始化也控制了从哪一个数字开始比较,我们是从第一个数字开始,也就是下标为0的数字开始,比较元素个数 - 1次即可,假设我们要比较3个数的大小,那么我们只需要比较前两个数字,就可以知道第三个数字的大小,所以外层循环的控制条件是arr.length - 1
2.内层循环控制的是从要比较的数字与其余所有数字的具体比较实现,因为比较过得数字没有必要在进行比较,所以我们只需要从外部循环给定的需要比较的数字开始比较即可
3.升序和降序由内部循环的比较进行决定,如果大于交换则是想要小的值,就是升序,如果小于交换就是想要大的值,就是降序
二、冒泡排序
冒泡排序是从第一个数开始依次往后两两相比,将最大(降序)/最小(升序)的数一直保留带到最后,相当于保镖保护着大哥一路往后走,只有最大或者最小的数才能一路才能走到最后,其他数都要给他让路(交换),下面让我们用代码来具体了解一下
将数组中的元素按降序排列实现代码如下:
int [] arr = {3,5,56,73,43,108,89,7,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;
}
}
}
System.out.println(Arrays.toString(arr));
//输出结果为[108, 89, 73, 56, 43, 27, 7, 5, 3];
需要的注意问题:
1.外层循环控制的是比较的次数,从下标为0的数开始依次与后面的数两两相比,假如有3个数,那么只需要比较两次即可知道这三个数的顺序
2.内层循环控制的是比较的具体实现,因为每次都是把符合条件的数放到最后,所以每次都是从下标为0的数开始依次与后面的数两两相比,因为后面的数字已经排好了位置,所以没必要在比较,排好了几个数是由i来决定的,所以这里可以减去i来提高运行效率
三、二分查找法
大家都知道一张普通的A4纸最多对折7次,吉尼斯世界纪录所用的巨大的卫生纸经过对折后也才最多13次,二分查找法与此原理相同,就是通过这种思维来快速的找到元素所在的位置,每一次查找就可以排除一半量的数据,在数据量如此众多的时代,这无疑是一种效率非常高的方法
使用二分查找法的前提是该数组已经按照升序排列,原理是我们设定一个开始(start)、结束(end)和中间(mid)位置的下标,将要查找的数与该数组的中间值相比较,如果比中间值小,就说明在start和mid之间,则mid就成为了end,如果比中间值大,则mid就成为了start,并赋予新的中间值,然后再进行比较,依次类推,最后找到最终值
写一个方法,返回指定数组下的指定数据的下标值,如果不存在则返回-1,实现代码如下(示例):
public static int findData(int[] arr, int find){
int start = 0;
int end = arr.length - 1;
int findIndex = -1;
while(start <= end){
int mid = (start + end) / 2;
if(find == arr[mid]){
findIndex = mid;
break;
}else if(find < arr[mid]){
end = mid - 1;
}else if(find > arr[mid]){
start = mid + 1;
}
}
return findIndex;
}
假设我们要找数组中是否有数据为143实现过程如图所示:
四、Arrays类(对数组的操作)
Java中提供了Arrays类专门对数组对象进行操作,包括排序,判断是否相等,替换值等操作
1.对数组进行升序排序
Arrays.sort()方法
实现代码如下(示例):
int [] arr = {3,5,56,73,43,108,89,7,27};
System.out.println("**********排序前***********");
for (int i : arr) {
System.out.println(i + " ");
}
System.out.println("**********排序后***********");
Arrays.sort(a);
for (int i : a) {
System.out.println(i);
}
需要的注意问题:
该方法只能进行升序排序
2.判断两个数组是否相等
Arrays.equals()方法
实现代码如下(示例):
String [] str1 = null;
String [] str2 = null;
System.out.println(Arrays.equals(str1,str2));
int[] array1 = {3};
int[] array2 = {4};
System.out.println(Arrays.equals(array1,array2));
//输出结果为true false
需要的注意问题:
只有两个数组的数据类型及数据都相同是才返回true
3.将数组转换成字符串
Arrays.toString()方法
实现代码如下(示例):
String [] a = {"1","2","3"};
System.out.println(Arrays.toString(a));
//输出结果为[1, 2, 3]
需要的注意问题:
返回的是用中括号括起来,每个元素之间用逗号分隔
4.把数组中的所有元素都替换成一个值
Arrays.fill()方法
实现代码如下(示例):
String [] a = {"1","2","3"};
Arrays.fill(a,"哈哈,被替换了");
System.out.println(Arrays.toString(a));
//输出结果为[哈哈,被替换了, 哈哈,被替换了, 哈哈,被替换了]
需要的注意问题:
替换之前的数据类型要和替换之后的数据类型保持一致
总结
本文讲解了选择排序、冒泡排序以及二分查找法的原理和代码实现,以及通过Arrays类快速实现对数组的一些操作,希望对各位有所帮助