冒泡排序:
两个相邻元素依次比较,有n个元素就比较n-1次
一轮结束后,就有一个元素位置固定,下次比较的元素总数减一。
重复上面步骤。。。
public static void bubbleSort(int[] arr) {
// 外层:所需比较趟数,每一趟固定一位
for (int j = 0; j < arr.length - 1; j++) {
// 内层:挨个比较,找出每一趟最大的
// 减j,是每一轮就相当于减少一个比较的元素,
for (int i = 0; i < arr.length - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
}
选择排序:
全部比较,找最小的,每次确定一位。
将第一个当做最小,和后面比较,找最小的放到第一位
重复上述过程
public static void selectSort(int[] arr) {
for (int current = 0; current < arr.length - 1; current++) {
// 假设当前上最小的
int min = current;
for (int i = current + 1; i < arr.length; i++) {
// 判断是否有其他元素比min还小的
if (arr[min] > arr[i]) {
// 如果有就把这个比min还小的元素下标,赋值给min
min = i;
}
// 判断第-个元素是否是最小的
if (min != current) {
// 如果第一个元素不是最小的,就让该元素和最小的元素换位
int temp = arr[current];
arr[current] = arr[min];
arr[min] = temp;
}
}
}
}
效率比较
public static void main(String[] args) {
// 获取当前时间毫秒数
long startTime = System.currentTimeMillis();
int[] arr = new int[99999];
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
// nextInt : 在int范围内 随机生成一个int数值
arr[i] = random.nextInt();
}
long endTime = System.currentTimeMillis();
System.out.println("数据初始化完成 : " + (endTime - startTime));
// 选择排序
startTime = System.currentTimeMillis();
Paixu_02.selectSort(arr);
endTime = System.currentTimeMillis();
System.out.println("选择排序完成 : " + (endTime - startTime));
// 冒泡排序
startTime = System.currentTimeMillis();
Paixu_01.bubbleSort(arr);
endTime = System.currentTimeMillis();
System.out.println("冒泡排序完成 : " + (endTime - startTime));
}
二分查找
查找数据,比如在一堆数据中要找到某一个并返回其索引,未找到返回-1
返回值为boolean:真就是true假就是false
返回数字:比如返回索引,能找到就返回索引,找不到就返回-1
引用类型:真就是对象,假就是null
public static int binarySearch(int[] arr, int target) {
// 1 确定开始和结束还要中间数据
int startIndex = 0;
int endIndex = arr.length - 1;
int m = (startIndex + endIndex) / 2;
// 循环比较
while (startIndex <= endIndex) {
// 3 如果目标数据等于中间数据,返回中间数据的索引即可
if (target == arr[m]) {
return m;
}
// 如果目标数据大于中间数据的话,则在后半截继续查找,起始=中间+1,结束不变,再生成中间数据
if (target > arr[m]) {
startIndex = m + 1;
} else {
// 如果目标数据小于中间数据的话,则取前半截,起始不变,结束=中间-1,再生成中间数据
endIndex = m - 1;
}
// 生成中间数据
m = (startIndex + endIndex) / 2;
}
// 能执行到这里 , 说明不存在
return -1;
}