排序算法(一)(Java实现)

   本文主要介绍七种基本的排序算法:冒泡排序,快速排序,插入排序,希尔排序,选择排序,堆排序和归并排序。其中,快速排序是冒泡排序的增强,希尔排序是插入排序的增强,堆排序是选择排序的增强。

1、冒泡排序
原理:第一轮比较,将序列中的每个元素两两进行比较,小于则交换,直到比较到最后一个位置,相当于将第一轮将序列中最大的数放在了最后一个位置;第二轮,将序列中的每个元素(最后一个除外)两两比较,小于则交换,将这一轮中的最小值放到倒数第二个位置上,依次进行,直到剩下一个元素进行比较。
举例如下:
冒泡排序举例
代码实现如下:

 public void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 public void BubbleSort(int[] arr){
        for(int i = 0;i < arr.length;i++){
            for(int j = 0;j < arr.length-1-i;j++){//注意循环边界条件
                if(arr[j] > arr[j+1]){
                    swap(arr,j,j+1);
                }
            }
        }
    }

算法分析:
(1)算法性能
在这里插入图片描述
(2)时间复杂度
若序列是正序的,则只需一次即可得到有序序列,这是最好的情况,时间复杂度为O(N);
若序列是反序的,需要进行N-1趟排序,比较和移动次数均达到最大值,时间复杂度为O(N^2);
所以冒泡排序的平均时间复杂度为O(N^2),也就是说,序列越接近正序,冒泡排序的性能越好。
(3)稳定性
冒泡排序是将大元素后移或小元素前移,比较和移动也是两个元素之间,所以,相同元素的前后顺序并未改变,是一种稳定的排序算法。

2、插入排序
原理:将一个序列分为有序序列和无序序列,初始状态将第一个元素作为有序序列,其余元素为无序序列;将无序序列中的元素一次与有序序列中的元素进行排序,插入到合适位置,直到无序序列中的最后一个元素插入到有序序列中为止。
举例如下:
插入排序
代码实现如下:

 public void insertSort(int[] arr){
        for(int i = 1;i < arr.length;i++) {//若a大于b,将b插入a前面,i要从下标为1处开始遍历
            if (arr[i] < arr[i - 1]) {
                int temp = arr[i];
                int j = i - 1;
                for (; j >= 0; j--) {
                    if (arr[j] > temp) {//将大于temp的往后移动
                        arr[j + 1] = arr[j];
                    }else{
                        break;
                    }
                }
                arr[j + 1] = temp;
            }
        }
    }

算法分析:
(1)算法性能
在这里插入图片描述
(2)时间复杂度
序列越接近正序,算法性能越好,时间复杂度为O(N);
序列越接近反序,算法性能越差,时间复杂度为O(N^2);
(3)稳定性
改变后的相同元素的前后顺序未改变,则插入排序为稳定的算法。
3、选择排序
原理:先将第一个元素与其余元素依次比较,若第一个元素大于第二个元素交换,再将第三个元素与第一个位置上元素进行比较,依此类推,第一轮后第一个位置上的元素是最小的,接着进行第二轮比较,等等,直到最后一个位置。
选择排序
代码实现:

    public void chooseSort(int[] arr){
        for(int i = 0;i < arr.length;i++){
            //第一轮将最小的数放在最前面(每个数与第一个数比较,小则交换);
            // 第二轮从第二位数开始比较,结果将这一轮中最小的数放在第二位置上,一次进行到最后一位
            for(int j = i+1;j < arr.length;j++){
                if(arr[j] < arr[i]){
                    swap(arr,j,i);
                }
            }
        }
}

算法分析:
(1)性能分析
在这里插入图片描述
(2)时间复杂度
选择排序的比较次数与序列的初始顺序无关,为N(N-1)/2;
当序列为基本正序时,移动次数最少,时间复杂度O(N^2);
当序列为反序时,移动次数最多,3N(N-1)/2,时间复杂度为O(N^2)
(3)空间复杂度
在比较元素时,需要占用一个空间来保存临时值,空间复杂度为O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值