Java数据结构------三种排序算法

一、冒泡排序

1.设计思路:

重复走过要排序的数列,一次比较相邻的两个元素,如果第一个比第二个大,就交换它们。这一工作重复地进行直到没有元素在需要交换,该数列排序完成。

2.效率分析:

时间复杂度:O(n^2)
空间复杂度:O(n^2)

3.代码实现:
private static <T> void swap(T arr[], int i, int j) {
    T temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;
}

public static <T extends Comparable<T>> void bubbleSort(T[] arr) {
    if (arr == null || arr.length == 0 || arr.length == 1) {
        return;
    }
    for (int i = 0; i < arr.length; i++) {
        boolean flag = false;
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr[j].compareTo(arr[j + 1]) > 0) {
                flag = true;
                swap(arr, j, j + 1);

            }
        }
    }
}

二、选择排序

1.设计思路:

在待排序序列中找最小值,最小值和待排序序列头部元素进行交换。

2.效率分析:

时间复杂度:O(n^2)
空间复杂度:O(1)

3.代码实现:
public static <T extends Comparable<T>> void selectSort(T[] arr) {
    if (arr == null || arr.length == 0 || arr.length == 1) {//安全检测
        return;
    }
    for (int i = 0; i < arr.length; i++) {//控制待排序序列中起始位置
        int minIndex = i;//最小值所在的下标
        for (int j = i; j < arr.length; j++) {//从头到尾挑选最小值
            if (arr[minIndex].compareTo(arr[j]) > 0) {
                minIndex = j;
            }
        }
        //最小值和i下标所在的值进行交换
        swap(arr, minIndex, i);

    }
}

三、插入排序

1.设计思路:

数列中第一个元素为已排序序列,第二个元素往后为待排序序列,将待排序序列中的元素向已排序序列中依次在合适的位置插入。
特点:越有序越快。

2.效率分析

时间复杂度:O(n^2)
空间复杂度:O(1)
最优时间复杂度:1 2 3 4

3.代码实现:
public static <T extends Comparable<T>> void insertSort(T[] arr) {
    if (arr == null || arr.length == 0 || arr.length == 1) {
        return;
    }
    for (int i = 1;i<arr.length;i++){
        T value = arr[i];
        //将i所在下标元素插入到已排序序列合适位置
        for(int j = i-1;j>=0;j--){//j用来移动元素
            if(arr[j].compareTo(value)>0) {
                arr[j + 1] = arr[j];
            }else{
                break;
            }
                //当前待排序元素放置合适位置
                arr[j+1] = value;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值