Java_七大排序算法知识总结 之 选择排序 冒泡排序 快速排序

目录

1.选择排序

1.1 Java代码实现

1.2性能分析

1.3 稳定性

2.冒泡排序

2.1 Java代码实现

2.2优化

2.3性能分析

2.4稳定性

3.快速排序

3.1Java解决问题代码

3.2性能分析

3.3稳定性


1.选择排序

       每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。

1.1 Java代码实现

public static void selectSort(int[] arr) {
        for(int i = 0; i < arr.length - 1; i++) {
            int max = 0;
            for(int j = 1; j < arr.length - i; j++) {
                if(arr[j] > arr[max]) {
                    max = j;
                }
            }
            int tmp = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = arr[max];
            arr[max] = tmp;
        }
    }

1.2性能分析

时间复杂度空间复杂度
O(n^2)O(1)
数据不敏感

1.3 稳定性

          不稳定的排序

2.冒泡排序

       在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。 

2.1 Java代码实现

public static void bubbleSort1(int[] arr) {//普通的冒泡排序
        for(int i = 0; i < arr.length - 1; i++) {
            for(int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j +1]) {
                    swap(arr,j,j+ 1);
                }
            }
        }
    }

2.2优化

       每次比较时定义一个 boolean 类型的变量,判断是否进入交换界面,若没有进入则表示后续元素都有序,因此可以跳出循环。

public static void bubbleSort2(int[] arr) {//优化后的冒泡排序
        for(int i = 0; i < arr.length; i++) {
            boolean isChange = false;
            for(int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j + 1]) {
                    swap(arr,j, j + 1);
                    isChange = true;
                }
            }
            if(!isChange) {
                break;
            }
        }
    }

2.3性能分析

时间复杂度空间复杂度
最好平均最坏
O(n)O(n^2)O(n^2)O(1)
数组有序数组逆序

2.4稳定性

         稳定的排序

3.快速排序

1. 从待排序区间选择一个数,作为基准值(pivot);

2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可 以包含相等的)放到基准值的右边;

3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间 的长度 == 0,代表没有数据。

3.1Java解决问题代码

public static int quickSortIndex(int[] arr,int start, int end) {
        int low = start;
        int high = end;
        int pivot = arr[start];
        while (low < high) {
            while (low < high && arr[high] > pivot) {
                high--;
            }
            arr[low] = arr[high];
            while (low < high && arr[low] < pivot) {
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = pivot;
        return low;
    }
    public static void quickSort(int[] arr, int start, int end) {
        if(start >= end) {
            return;
        }
        int pivot = quickSortIndex(arr,start,end);
        quickSortIndex(arr,start,pivot - 1);
        quickSortIndex(arr, pivot + 1,end);
    }

3.2性能分析

时间复杂度空间复杂度
最好平均最坏最好平均最坏
O(n*log(n))O(n*log(n))O(n^2)O(log(n))O(log(n))O(n)

3.3稳定性

         不稳定排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值