二分法,冒泡,选择,插入排序

二分法查找

算法描述:有已排序的数组,定义左边界和右边界,确定搜索范围,循环执行二分法查找。

步骤:

  1. 获取中间索引M = (L + R)/2
  2. 将中间索引与需要搜索的值进行比较
    1. 若搜索值等于中间索引,返回结果
    2. 若搜索值大于中间索引,左索引为M + 1,重新查找
    3. 若搜索值小于中间索引,右索引为M - 1,重新查找
  3. 当左索引大于右索引时,没有找到搜索的值,循环结束

算法实现:

public class BinarySearch {
    public static int binarySearch(int[] array, int t){
        int res = 0;
        int left = 0;
        int right = array.length - 1;
        int count = 0;
        while (array[left] < array[right]){
            ++count;
            //int m = (L + R)/2;
            int m = left + (right - left)/2;
            //若中间值等于搜索值,直接返回
            if (array[m] == t){
                res = array[m];
                break;
            }
            //若中间值小于搜索值
            if(array[m] < t){
                //右索引变为中间值并向左移动一位
                left = m + 1;
            }
            //若中间值大于搜索值
            if (array[m] > t){
                right = m - 1;
            }
        }
        //若左索引大于右索引
        if(array[left] > array[right]){
            throw new RuntimeException("未找到这个数字");
        } else {
            System.out.print("循环了" + count + "次");
            return res;
        }
    }

    public static void main(String[] args) {
        int[] a = {1,5,8,11,26,32,34,46,47,58};
        int t = 15;
        int result = binarySearch(a, t);
        System.out.println("结果是"  + result);
    }
}

冒泡排序

算法描述:在一组无序的数组中,将相邻的两个元素进行比较,若是前面的元素大于后面的元素进行比较,若前面的元素大于后面的元素,则将这两个元素的位置进行交换,一直向后推移,直到最大的元素在数组末尾,一直循环知道数组呈顺序排列。

步骤:

  1. 将第一个元素与第二个元素进行比较
    1. 若第一个元素大于第二个元素,则进行交换,在将第二个元素与第三个元素进行比较,以此循环
    2. 若第一个元素小于第二个元素,不交换,再将第二个元素与第三个元素进行比较,以此循环
  2. 执行上述步骤,知道最大的数到达数组末尾
  3. 继续进行比较,指向第一步,知道第二大的数到达数组的倒数第二的位置
  4. 以此循环,直到数组全部排序完成

算法实现:

import java.util.ArrayList;
import java.util.Arrays;

public class BubbleSort {
    public static void bubbleSearch(int[] array){
        //外循环,控制整个数组的排序
        for (int i = 0; i < array.length - 1; i++){
            boolean falg = false;
            //内循环,将里面的元素放到它们应该呆的地方
            for (int j = 0; j < array.length - 1 - i; j++){
                if (array[j] > array[j + 1]){
                    swap(array, j, j + 1);
                    falg =true;
                }
            }
            //当某一轮冒泡没有发生交换,那么flag为false,此时数组已经排好序了,可以结束了
            if (!falg){
                break;
            }
        }
        System.out.println(Arrays.toString(array));
    }
    //将数组中的两个元素进行交换
    public static void swap(int[] array, int a,int b){
        int temp = 0;
        temp = array[a];
        array[a] = array[b];
        array[b]  = temp;
    }

    public static void main(String[] args) {
        int[] a = {5,78,9,65,12,33,51,46,20,31};
        bubbleSearch(a);
    }
}

选择排序

算法描述:在无序的数组中,找到最小的元素将其放在第一位,然后在剩余的元素找找到最小的元素放在第二位,以此类推,直到排序完成

步骤:

  1. 找到数组中的最小元素,与第一位的元素交换,若最小元素就在第一位或与第一位元素相等则跳过
  2. 在剩下的元素中找到最小元素,与第二位元素交换,若最小元素本身就在第二位或者与第二位元素相等则跳过
  3. 以此类推直到排序结束

算法实现:

import java.util.Arrays;

public class SelectSort {
    public static void selectSearch(int[] array){
        for (int i = 0; i < array.length - 1; i++){
            //目前最小元素索引为i
            int min = i;
            for (int j = i + 1; j < array.length; j++){
                //若当前元素小于索引为min的元素
                if(array[j] < array[min]){
                    min = j;
                }
            }
            //找到剩下元素中的最小元素后与索引为i的元素进行比较
            if (array[i] != array[min]){
                swap(array, i, min);
            }
        }
        System.out.println(Arrays.toString(array));
    }
    public static void swap(int[] array, int a, int b){
        int temp = 0;
        temp = array[a];
        array[a] = array[b];
        array[b] = temp;
    }

    public static void main(String[] args) {
        int[] array = {10,65,21,39,78,12,20,39,39,68};
        selectSearch(array);
    }
}

插入排序

算法描述:将数组分为两个区域,一个是排序区域和未排序区域,在未排序区域中找到最小的元素插入到排序区域中,排序区域中的元素都是按顺序排列,重复上述步骤,直到数组排列完成

步骤:

  1. 待插入的元素与前面的元素比较
  2. 若待插入元素小于前面的元素,将待插入元素暂存在一个变量中,将前面大于待插入的元素全部向后移动一位
  3. 将待插入元素插入空出来的位置
  4. 以此循环,直至排序完成

算法实现:

import java.util.Arrays;

public class InsertionSort {
    public static void insertionSort(int[] array){
        for (int i = 1; i < array.length; i++){
            //待插入的元素
            int temp = array[i];
            //待插入元素的前一个元素
            int fornt = i - 1;
            while (fornt >= 0){
                //若待插入元素小于前面的元素,这里不只是前一个元素,是前面所有小于temp的元素
                if (temp < array[fornt]){
                    //将待插入元素前的元素向后移动一位
                    array[fornt + 1] = array[fornt];
                }else {
                    //若没有小于temp的元素,直接结束
                    break;
                }
                //前一个元素移动丸了,还有前前一个元素,以此类推
                fornt--;
            }
            //当跳出while循环后,索引为fornt的元素等于或小于temp,所以将temp插入fornt元素的后面
            array[fornt + 1] = temp;
        }
        System.out.println(Arrays.toString(array));
    }

    public static void main(String[] args) {
        int[] a = {16,49,85,22,16,21,14,10,6,8};
        insertionSort(a);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二分法排序和冒泡排序是两种不同的排序算法二分法排序是一种基于比较的排序算法,其原理类似于数学的二分法。它的算法思想是,在总共有N个元素的数组中,当插入第i个元素时,对前面的0~i-1个元素进行折半查找,先跟中间的元素比较,如果小于中间元素,则再对前一半的元素进行折半查找;否则,对后一半的元素进行折半查找。重复这个过程,直到左边的索引小于右边的索引,然后将第i个元素插入目标位置,并将目标位置之间的所有元素后移。最后得到一个有序的数组。 冒泡排序是一种简单但效率较低的排序算法。它的基本思想是通过相邻元素的比较和交换来实现排序。在Java中,冒泡排序通常使用双层循环来实现,外层循环控制排序轮数,总循环次数为要排序数组的长度减1。而内层循环主要用于对比相邻元素的大小,以确定是否需要交换位置。随着排序轮数的增加,对比和交换次数逐渐减少,直到得到一个有序的数组。 以下是一个使用Java语言实现二分法排序和冒泡排序的示例代码: ``` // 二分法排序 public static void binarySort(int[] arr) { int len = arr.length; for (int i = 0; i < len; i++) { int target = arr[i]; int left = 0; int right = i - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (target < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } for (int j = i - 1; j >= left; j--) { arr[j + 1] = arr[j]; } arr[left] = target; } } // 冒泡排序 public static void bubbleSort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值