java冒泡排序及优化

前言:今天在复习一些算法时,看到了我们最书序的冒泡排序,故写这篇笔记来复习一下
首先:实现思路 -->以升序为例
1.依次比较数组中两个元素的大小,若a[i]>a[i+1],则交换两个元素,两两都比较一次,称为一轮冒泡,最终结果就是将数组中最大的元素排到最后
2.重复步骤,直到整个数组有序

其次:优化思路–>
当每轮冒泡时,最后一次交换的索引可以作为下一轮冒泡的比较此时,
如果这个值为0.则表示整个数组有序,直接退出外层循环即可

冒泡排序v1–>简单版

例如:我们有这样一个数组

int[] a ={5,9,7,4,1,3,2,8};

最简单的思路是:
1.一共有8个数,从第一个开始我们可以比较7次,则可以将最大的数置于最后**–>即比较次数为a.lenth-1次此为内层循环**
2.每一次冒泡后将比较后的数记录下来–>即冒泡次数也为a.lenth-1次 此为外层循环
故:我们可以写成java冒泡排序及优化_第1张图片

冒泡排序-v2

其实我们知道在内层比较之后,每一次比较完成,都会将大数放到后面,例如:第一次比较后9在后面,第二次比较后 8 9固定,这种写法则还会进行后面的重复比较,但实际上我们只需要比较未比较的即可.
减少比较次数
代码优化:减少比较次数->内存循环随着外层每次将后面的数排好后,则后面比较的次数减少 ,-j即可
java冒泡排序及优化_第2张图片
减少冒泡次数
减少冒泡次数->可以看到在第五次冒泡就已经排序好了,在排序好后,没有必要继续排序了
java冒泡排序及优化_第3张图片
那么如何减少冒泡的次数呢–>我们可以发现,我们只要不调用swap方法则说明我们已经排序好了。
实现思路:故我们可以通过
设置一个boolean 类型的 swapped =false;
如果进入到里循环,则执行了swap方法,把swapped =true;
如果swapped=false则说明没有执行swap方法,swapped=false,则执行break操作,直接跳出外层循环
java冒泡排序及优化_第4张图片

冒泡排序v3

优化思想:
5 9 7 4 1 3 2 8 在第一次排序后
5 7 4 1 3 2 8 9 其实这时,后面两个最大数已经记录下来了 ,我们只需要记录下最后一次交换前的索引,例如这里记录:索引为4,则后续只需要比较4次即可

最终优化后代码:

public static  void bubble_v2(int[]a){
    int tmp =a.length-1;
    while (true) {
        int last = 0;//记录最后一次last的索引
    for (int i = 0; i < tmp; i++) {
        System.out.println("比较次数"+i);
        if (a[i]>a[i+1]){
            swap(a,i,i+1);
            last = i;//将最后一次交换后的索引记录下来
        }
    }
        System.out.println("第轮冒泡"+Arrays.toString(a));
        tmp = last;
        if (tmp == 0){
            break;
        }
    }
}
public static void swap(int[] a,int i,int j){
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}

你可能感兴趣的:(java,算法,排序算法)