前言
Java中的数组是一种数据集合。有时我们需要对这些数据元素进行排序,找出数组中的最大值、最小值,或者是按降序或升序对数组进行排列。但我们要注意,对数组排序会修改数组本身,即数组里元素的内存指向会发生改变。
一般对数组进行排序是数据结构中的某些排序算法来进行实现,比如著名的冒泡排序、选择排序等,当然也可以利用Java自带的Arrays.sort()方法来实现。
1.冒泡排序
按从小到大排序举例:
1.比较相邻的两个元素,若前边的元素大于后边的元素则交换。
2.每一对相邻元素都要进行比较。每一个轮次,将最大的排到最后。
3.针对剩余的元素,重复上述步骤。
4.没有元素交换,完成排序。
import java.util.Arrays;
public class TestBinarySearch {
public static void main(String[] args) {
int[] arr = {33, 167, 34, 315, 471, 52, 68, 70, 87, 99};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
int temp;
boolean flag;
for (int i = arr.length - 1; i > 0; i--) { // 每次需要排序的长度
flag = false;
for (int j = 0; j < i; j++) { // 从第一个元素到第 i 个元素,即对剩余元素进行处理
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (!flag){ //如果为false 则没有发生交换,排序结束
break;
}
}
}
}
2.选择排序
第一趟,程序将记录定位在第一个数据上,拿第一个数据依次和后面的数据进行比较,如果第一个数据大,交换,依次类推。经过第一趟比较,这组数据中最小的数据被选出来,排在第一位。
第二趟,程序将记录定位在第二个数据上,拿第二个数据依次和后面的数据比较,同样地,第二个数据大就交换。经过第二次比较,这轮最小的书被选出来,放在了第二位。
这样经过n-1次比较,这组数据就会变得有序。
private static void selectSort(int[] arr) {
for(int i = 0;i < arr.length;i++) {
//将当前索引0定为最小值索引
int min = i;
//通过循环找出最小值索引。注意:此处未发生交换
for(int j = i + 1;j < arr.length;j++) {
if(arr[j] < arr[min]) {
min = j;
}
}
//若最小值索引不为i,则交换
if(min != i) {
int tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}
3.二分查找
二分查找的使用,要有一个前提条件:要查找的数必须在一个有序数组里。在这个前提下,取中间位置数作为比较对象。
- 若要查找的值和中间数相等,则查找成功。
- 若小于中间数,则在中间位置的左半区继续查找。
- 若大于中间数,则在中间位置的右半区继续查找
不断重复上述过程,直到查找成功或者查找区域变为 0,查找失败。
public static int binarySearch(int[] nums, int left, int right, int target){
if (left>right){ //没有查找到
return -1;
}
int mid =( left+right)/2;//找区间中间值
if (nums[mid]>target){
return binarySearch(nums,left,mid-1,target);//找左区间
}else if (nums[mid]<target){
return binarySearch(nums,mid+1,right,target);//找右区间
}else {
return mid; //找到
}
}
或下面的写法:
public class BinarySearchTest {
public static void main(String[] args) {
int[] arr = {3, 16, 34, 35, 47, 52, 68, 70, 87, 99};
System.out.println(binarySearch(arr, 52)); // 5
}
// 二分查找
private static int binarySearch(int[] arr, int num) {
int min = 0;
int max = arr.length - 1;
while (true) {
if (min > max) {
return -1;
}
int mid = (min + max) / 2;
if (arr[mid] > num) {
max = mid - 1;
} else if (arr[mid] < num) {
min = mid + 1;
} else {
return mid;
}
}
}
}
其他:
字符串方法
int i = s1.compareTo(s2); 返回int,-1表示s1小于s2。
lambda表达式
-
例如 ( ) -> {}
-
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1;
}); -
Lambda表达式可以用来简化匿名内部类的书写。
-
Lambda表达式只能简化函数式接口的匿名内部类的写法。
-
函数式接口:有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@FunctionalInterface注解。
-
和 js 的箭头函数写法很像,省略写法和箭头函数一样。