排序和查找算法

冒泡排序

图解
在这里插入图片描述

代码实现

/**
 * @Description:冒泡排序
 * @date 2021/9/5 9:30
*/
public static int[] bubbleSort(int[] a){
    /**
     * @Description:如果数组长度为 n,一共要进行 n-1 次排序,每次确认一个最大或最小值
    */
    for (int i = 0; i < a.length - 1; i++) {
        /**
         * @Description:每一个排序,要进行 n-1-i 次比较
        */
        for (int j = 0; j < a.length - 1 -i; j++){
            // 如果序号为0元素大于序号为1的元素,则交换
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    // 返回有序数组
    return a;
}

测试

int[] a = {-23, 6, 5, 86, 99, 1000, -98};
int[] sort = bubbleSort(a);
for (int s : sort){
    System.out.print(s + ", ");
}

在这里插入图片描述

如果要优化,那就是第一次排序如果没有元素交换,就证明原来的数组就是有序的,我们可以不用进行后面的排序了


选择排序

图解

  • 第一次排序
    在这里插入图片描述
  • 第二次排序
    在这里插入图片描述
  • 如果数组长度为n,以此类推一共进行了 n - 1次排序

代码实现

/**
 * @Description:选择排序
 * @date 2021/9/5 10:43
*/
public static int[] selectSort(int[] a) {
    // 选择排序的排序次数
    for (int i = 0; i < a.length - 1; i++){
        // 赋初值和标记最小值的下标
        int min = a[i];
        int minIndex = i;
        for (int j = i + 1; j < a.length; j++){
            // 拿后面的值和当前最小值比较,比它小则赋值给最小值,且标记当前最小值下标
            if (min > a[j]) {
                min = a[j];
                minIndex = j;
            }
        }
        // 第一次排序比较完成后,查询最小值下标是否变化,没有变化则表示当前值已经是最小值,不用交换位置,反之则交换位置
        if (i != minIndex){
            a[minIndex] = a[i];
            a[i] = min;
        }
    }
    return a;
}

插入排序

图解

在这里插入图片描述

代码实现

/**
 * @Description:插入排序
 * @date 2021/9/5 10:58
*/
public static int[] insertSort(int[] a)
{
    for (int i = 0; i < a.length - 1; ++i) {
        // 记录有序序列最后一个元素的下标,一开始标记的是第一个
        int end = i;
        // 待插入的元素,第二个元素是待插入的元素,往第一个元素形成的有序序列插入
        int insert = a[end + 1];
        // 单趟排
        while (end >= 0) {
            // 插入的数如果比有序序列最后的值(也就是最大的值)大,就不用改变位置,直接已经是最大的数了而且位置是排正确了
            // 如果小,就把有序数组最后的数往后移一个位置
            if (insert < a[end]) {
                a[end + 1] = a[end];
                // end--就是把待插入的值下标往前移一位,因为上面一行代码表示前一个数已经往后移动了
                // 如果end下标小于0则证明待插入的值是最小的了
                end--;
            } else {
                // 比插入的数小,跳出循环,否则一直比较
                break;
            }
        }
        // 待插入的值放到比它小的数的后面
        a[end  + 1] = insert;
        // 代码执行到此位置有两种情况:
        // 1.待插入元素找到应插入位置(break跳出循环到此)
        // 2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
    }
    return a;
}

快速排序

图解

在这里插入图片描述

代码实现

/**
 * @Description: 快速排序
 * @Param a:初始数组
 * @Param left:右指针
 * @Param right:左指针
 * @date 2021/9/5 11:45
*/
public static int[] quickSort(int[] a, int left, int right) {
    // 如果左指针大于等于右指针则表明已完成一趟排序
    if (left >= right) {
        return a;
    }
    int l = left;
    int r = right;
    while (l < r) {
        // 先比较右指针,如果右指针指向的值比基准值大则把右指针往左移一位
        while (l < r && a[r] >= a[left]){
            r--;
        }
        // 然后比较左指针,如果左指针指向的值比基准值小则把左指针往右移一位
        while (l < r && a[l] <= a[left]){
            l++;
        }
        if (r == l) {
            int temp = a[r];
            a[r] = a[left];
            a[left] = temp;
        } else {
            int temp = a[r];
            a[r] = a[l];
            a[l] = temp;
        }
    }
    // 左边进行递归快排
    quickSort(a, left, l-1);
    // 右边进行递归快排
    quickSort(a, r + 1, right);
    // 返回排好的序列
    return a;
}

二分查找

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值