数组的排序有很多种,这里使用的是很经典的冒泡排序。冒泡排序在每次遍历时会将最大值找出,并移动至最右边,最终得到一个由小到大排序的数组。
/**
* 冒泡排序法
* @param arr
*/
private static void maoPao(int[] arr) {
// 空的或没元素,不用继续
if (arr == null || arr.length == 0) {
return;
}
// 第一、定义临时变量
int t;
// 第四、是否排序完成
boolean isSorted;
// 第二、已经找到一个最大元素了,还需要找到下一个最大、下下一个
for (int j = 0; j<arr.length - 1; j++) {
// 第四、对于已经排序的数组,无需再次进行循环排序
isSorted = true; // 默认已经排好序
// 第一、先找出最大的元素
for (int i = 0; i<arr.length - 1 - j; i++) { // 第三、外层循环了几次,就找到了几个最大,就不需要再比较最后那几个元素
// 如果当前的元素比下一个大
if (arr[i]>arr[i+1]) { // 当前元素和下一个,如果i<=arr.length - 1的话会出现 arr[arr.length]>arr[arr.length+1],会越界
// 交换这两个元素
// 将小的数临时存储
t = arr[i+1];
// 交换前后两个数
arr[i+1] = arr[i];
// 小的数排在前面
arr[i] = t;
// 如果发生了交换,则说明排序未完成
isSorted = false;
}
}
// 可以查看每次排序后结果
System.out.print("第" + (j + 1) + "次排序后的结果:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
// 排序是否已经完成
if (isSorted) { // 排序完成
// 可以结束
break;
}
}
}
二分法是一种常见算法,二分法可以快速的查找一个元素在数组中的位置(时间复杂度O(logN)),相比顺序查找来说二分法的查询效率更高(顺序查找的时间复杂度O(N)),但是需要一个前提,那就是这个数组必须是经过排序的(由小到大),这里使用冒泡排序先将数组排序,再二分查找。
/**
* 二分法
* @param arr
* @param value
* @return
*/
public static int startSearch(int[] arr, int value) {
// 判断是否是有效数组
if (arr == null || arr.length == 0) {
return -1;
}
// 使用冒泡排序法排序
maoPao(arr);
// 定义开始索引
int startIndex = 0;
// 定义最后元素索引
int endIndex = arr.length - 1;
// 计算中间索引,int相除不会产生小数
int midIndex;
// 开始判断
while(startIndex <= endIndex) { // 当开始索引与结束索引相等后结束
// 计算中间索引,int相除不会产生小数
midIndex = (startIndex + endIndex)/2;
// 刚好等于中间值
if (value == arr[midIndex]) {
return midIndex;
}
// 大于,在中位索引的右边
if (value > arr[midIndex]) {
// 将起始索引设置为原中位索引的后一位
startIndex = midIndex + 1;
} else if (value < arr[midIndex]) { // 如果比中位小,则将最后的索引设置为中位前一位
endIndex = midIndex - 1;
}
// 重新设置中位索引
}
return -1;
}
测试:
public static void main(String[] args) {
int[] arr = {9, 11, 1, 3, 2, 4, 6, 5, 8, 7};
// maoPao(arr);
// // 查看排序后结果
// System.out.print("排序完成后的数组:");
// for (int num : arr) {
// System.out.print(num + " ");
// }
// 查询指定元素
int startSearch = startSearch(arr, 10);
System.out.println(startSearch);
}
输出:
第1次排序后的结果:9 1 3 2 4 6 5 8 7 11
第2次排序后的结果:1 3 2 4 6 5 8 7 9 11
第3次排序后的结果:1 2 3 4 5 6 7 8 9 11
第4次排序后的结果:1 2 3 4 5 6 7 8 9 11
-1