一、排序
概念:让元素按照一定的顺序排列,正序(从小到大)/倒序(从大到小)
1.1冒泡排序
每次都是让相邻的两个数进行比较,如果满足交换条件,则两数交换位置,直到循环结束,例:
public static void bubbleSort(int[] a){
for (int i = 0; i < a.length-1; i++) {//外循环控制循环次数
for (int j = 0; j < a.length-1-i; j++) {//内循环控制比较次数
//当前数大于后数时两数交换交换位置,这样内循环结束后,本次循环中最大的数就会在a[a.length-1-i],这个数就是本次循环的最后一个数
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
循环次数是数组长度减一,因为当循环到最后一次时只剩下了两个数进行比较,如果接着循环的话,那就只剩下最后一个数,已经不需要比较了;
比较次数是数组长度减一再减去循环次数(循环从零开始),原因同上,多循环一次也是只剩下一个数,不需要比较,例:
int[] arr = {2,4,3,5,1}//从小到大排列
第一次:2,3,4,1,5
第二次:2,3,1,4,5
第三次:2,1,3,4,5
第四次:1,2,3,4,5
第四次就是最后两个数进行比较,比较完后数组就排好序了,1也没必要和其他数再比较了
数组长度:5
循环次数:4 = 5-1
比较次数:
第一次:4 = 5-1-0//循环次数从零次开始
第二次:3 = 5-1-1
第三次:2 = 5-1-2
第四次:1 = 5-1-3//第五次循环次数就是0了,也就不需要接着循环了
1.2选择排序
每次都是让第 i 个数和其他数进行比较,如果arr[index]处的值比其他值大,则将更小的数的下标赋给index,内循环结束后,若满足条件则根据下标交换两数位置(这样就不用每次遇到满足交换条件的两个数时都进行交换,只用将符合条件的下标赋值给index即可)例:
public static void selectionSort(int[] a){
for (int i = 0; i < a.length-1; i++) {
int index=i;//用来存储第 i 个数的下标
for (int j = i+1; j < a.length; j++) {
if (a[index]>a[j]) {
//满足交换条件则将新的下标赋值给index
index=j;
}
}
if (index != i) {
//若index不是原来的下标,则表示原来的数不是最小的,则根据下标进行两数交换
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
二、查找元素
2.1顺序查找
从左到右依次查询,直到找到目标数据
public static int sequentialSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
//找到目标数据则返回下标
return i;
}
}
//未找到则返回-1
return -1;
}
2.2二分查找
使用条件:所查询的数据必须是有序的
每次都是用中间索引处的值与目标值进行比较,与目标值相等则返回索引(即下标)
若中间索引处的值大于目标值则起始索引不变,结束索引=中间索引-1
若中间索引处的值小于目标值则结束索引不变,起始索引=中间索引+1
中间索引=(起始索引+结束索引)/2
public static int binarySearch(int[] arr, int target) {
int startIndex = 0;// 起始索引初始值
int endIndex = arr.length - 1;// 结束索引初始值
int middle = (startIndex + endIndex) / 2;// 中间索引初始值
while (startIndex <= endIndex) {
if (arr[middle] == target) {
// 中间索引处的值与目标数值相等则直接返回
return middle;
} else if (arr[middle] > target) {
// 若中间索引处的值大于目标值则起始索引不变,结束索引=中间索引-1
endIndex = middle - 1;
} else {
// 若中间索引处的值小于目标值则结束索引不变,起始索引=中间索引+1
startIndex = middle + 1;
}
middle = (startIndex + endIndex) / 2;
}
return -1;
}