三种基本的排序算法--Java实现

记录一下基本的三种排序算法,也顺便复习一下时间复杂度的计算。
先是简单的交换,之后会用到

    private static void swap(int arr[], int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;

一、冒泡排序

依次将每个位置上的数字与逐一与其之后的数字进行比较

public static void BubbleSort(int arr[]) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                swap(arr, i, j);
            }
        }
    }
}

时间复杂度计算:(n-1)+(n-2)+…..+2+1+0≈n*(n-1)/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)

二、选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

public static void SelectSort(int arr[]) {
    for (int i = 0; i < arr.length; i++) {
        int index = i;//标记选择的数的下标,初始为第一个数
        for (int j = i + 1; j < arr.length; j++) {//遍历未排序区,找出未排序区最小的数
            if (arr[index] > arr[j]) {//未排序区有比标记数小的
                index = j;//将这个小的数标记下
            }
        }
        if (index != i) {//如果这个小的数,不是一
            swap(arr, index, i);
        }
    }
}

时间复杂度计算:(n-1)+(n-2)+…..+2+1+0≈n*(n-1)/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)

三、插入排序

每次取出无序区中的第一个元素,插入到有序区中

public static void InsertSort(int arr[]) {
    //有序区的最后一个元素下标
    int index = 0;
    for (int i = index + 1; i < arr.length; i++) {//有序区往上即是未排序区
        int insertIndex = i;//记录要在有序区的插入位置的下标,刚开始即是未排序位置的第一个数的下标
        int temp = arr[i];//记录下要在有序区插入的值,刚开始即是未排序区的第一个数
        for (int j = index; j >= 0; j--) {//有序区从后往前比较
            if (arr[j] < temp) {//当有序区有比插入的数要大的
                arr[j + 1] = arr[j];//有序区一位一位右移
                insertIndex--;//一位一位将要插入的数的下标移到目标位置
            } else {//一定要加判断,不然无法一位一位的移动
                break;
            }
        }
        arr[insertIndex] = temp;//将要插入的数赋值给目的下标所在的位置
        index++;//有序区范围扩大一位数
    }
}

时间复杂度计算:(n-1)+…+2+1= n*n/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)

四、结束语

以上都是自我的知识整理,如有错误欢迎指正!尤其是时间复杂度的计算,完全是看自己写的循环次数….
希望自己能成长的快一点吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值