一、冒泡排序
原理:
冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,一次比较两个元素,并且如果它们的顺序错误就交换它们。这个过程重复进行直到整个序列都是有序的。
冒泡排序的基本思想是通过相邻元素的比较和交换,将最大(或最小)的元素逐渐“冒泡”到序列的末尾。具体步骤如下:
1. 从序列的第一个元素开始,依次比较相邻的两个元素。
2. 如果这两个元素的顺序错误(比如,前一个元素大于后一个元素),就交换它们的位置。
3. 继续比较下一对相邻元素,直到整个序列都被遍历过。
4. 重复以上步骤,每次遍历都会将当前最大(或最小)的元素“冒泡”到序列的末尾。
5. 重复执行 n-1 轮遍历,直到整个序列都是有序的。
冒泡排序的时间复杂度为 O(n^2),其中 n 是序列的长度。在最坏情况下,需要进行 n-1 轮遍历,每轮遍历需要比较 n-i-1 次相邻元素并进行交换,因此总的比较和交换次数为 (n-1) * (n-1) = n^2 - 2n + 1。
实现思路:
- 定义一个函数 bubbleSort,接受一个待排序的数组作为参数。
- 使用两层循环来实现冒泡排序。外层循环控制遍历的轮数,内层循环用于比较相邻元素并进行交换。
- 在每一轮遍历中,从第一个元素开始,比较相邻的两个元素,如果顺序错误就交换它们的位置。
- 内层循环的结束条件是遍历到倒数第二个元素,因为最后一个元素已经是有序的。
- 每一轮遍历结束后,最大(或最小)的元素会“冒泡”到序列的末尾,因此下一轮遍历只需要遍历到倒数第二个元素即可。
- 最后,返回排序后的数组。
代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Bubble_Sort {
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1};
int arr_temp;
//i控制比较次数
for (int i = 1;i <= arr.length;i++){
//j遍历数组并进行比较
for (int j = 0;j <= arr.length-i-1;j++){
if (arr[j] > arr[j+1]){
arr_temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = arr_temp;
}
}
}
//输出结果
System.out.println(Arrays.toString(arr));
}
}
二、二分查找法
原理:
二分查找法是一种在有序数组中查找目标元素的算法。它的原理是通过将目标元素与数组的中间元素进行比较,从而确定目标元素在数组的左半部分还是右半部分,然后在相应的部分继续进行查找,直到找到目标元素或者确定目标元素不存在。
实现思路:
1. 首先,确定数组的左边界和右边界,左边界初始值为 0,右边界初始值为数组长度减 1。
2. 在每一次迭代中,计算中间位置 mid,mid 的值为 (左边界 + 右边界) / 2。
3. 比较目标元素与中间位置的元素的大小关系:
- 如果目标元素等于中间位置的元素,则找到目标元素,返回中间位置。
- 如果目标元素小于中间位置的元素,则目标元素可能在左半部分,将右边界更新为 mid-1。
- 如果目标元素大于中间位置的元素,则目标元素可能在右半部分,将左边界更新为 mid+1。
4. 重复上述步骤,直到左边界大于右边界,此时数组中不存在目标元素,则提示不存在。
二分查找法的时间复杂度为 O(log n),其中 n 是数组的长度。由于每次迭代都将查找范围缩小一半,因此最多需要 log n 次迭代才能找到目标元素或确定目标元素不存在。
注意:
当一个数组中存在多个相同的数的时候,可以先利用二分法找到相同的数,再遍历前后位置,直到找到不同的数字为止。
代码实现:
import java.util.Arrays;
import java.util.Scanner;
public interface Binary_search {
public static void main(String[] args) {
int[] arr = {3,3,3,3,3,6,7,8,9,12,12,36,45,45,45};
//先对数组进行排列,使用冒泡排序
int arr_temp;
//i控制比较次数
for (int i = 1;i <= arr.length;i++){
//j遍历数组并进行比较
for (int j = 0;j <= arr.length-i-1;j++){
if (arr[j] > arr[j+1]){
arr_temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = arr_temp;
}
}
}
System.out.println(Arrays.toString(arr));
//下面是查找
Scanner input = new Scanner(System.in);
System.out.println("请输入你要查找的数字:");
int n= input.nextInt();
//定义初始末位置
int first_index = 0;
int last_index = arr.length - 1;
int mid_index = (first_index + last_index) / 2;
//while循环控制比较次数,只要查找的数字不等于n,就一直循环
while (arr[mid_index] != n){
if (arr[mid_index] > n){
//当要查找的数字比中间数小的时候,就应该在前面的数之中进行查找,所以这里末位置变为mid_index-1
last_index = mid_index - 1;
}else if (arr[mid_index] < n){
//当要查找的数字比中间数大的时候,就应该在后面的数之中进行查找,所以这里起始位置变为mid_index+1
first_index = mid_index + 1;
}
if (first_index>=last_index){
break;
}
//将新的始末位置进相加除以2,就是新的中间值,再进行查找比较
mid_index = (first_index + last_index) / 2;
}
if (arr[mid_index] == n){
System.out.println(mid_index);
//输出结果
System.out.println(n + "的位置在数组中是第:" + mid_index + "位");
}else{
System.out.println("你查找的数字不存在!");
}
//当一个数组有几个相同的数时,先找到第一个数,也就是上面找到的数,再往前查找,如果前一位和这个数相等,则将这个数位置输出,然后继续往前找
for(int i=mid_index-1;i>=first_index;i--){
if (arr[i]==n){
System.out.println(n + "的位置在数组中是第:" + i + "位");
}
}
//当一个数组有几个相同的数时,先找到第一个数,也就是上面找到的数,再往后查找,如果后一位和这个数相等,则将这个数位置输出,然后继续往后找
for(int i=mid_index+1;i<=last_index;i++){
if (arr[i]==n){
System.out.println(n + "的位置在数组中是第:" + i + "位");
}
}
}
}
本人水平有限,存在错误的地方欢迎指正!