关于各种排序和涉及到的问题(持续更新)

排序问题

一:冒泡排序
1.冒泡排序是O(n^2)的时间复杂度,额外空间复杂度为O(1)
2.冒泡思想:每次找出一个最大值,放在最后一个位置,然后下次再找的时候,就忽略最后一个位置,然后将第二次的最大值放在倒数第二位,以此类推,当只剩下一个数字,就不需要再排了。
3.冒泡编程思路:第一层循环设置的是需要排序的终点,依次递减到1的位置,因为比较的过程是涉及到两个位置,所以不需要终点和起点重合,就可以比较完成,实际上起点不需要走到终点,只要走到终点-1的位置,就已经进行了比较了。,第二个循环从0一直到小于第一层设置的终点位置,不需要和终点重合,理由如上,第二层循环内,只要第i个数,比i+1大,就交换,保证将最终位置之前的最大值交换到最后位置。
4.代码:

 public static void bubbleSort(int[] arr) {
   
        if (arr == null || arr.length < 2) {
   
            //如果数组为空或者只要一个,就不用排序
            return ;
        }
        for (int end = arr.length - 1; end > 0; end--) {
   //end表示从后往前开始的排序好的数字
            for (int i = 0; i < end; i++) {
   //由于这是基于前一个数字,比较后一个数字,所以end所在位置的数字
                //是最后也要用于比较的,所以不需要担心,end=arr.length-1的时候,最后一个位置无法比较的情况。
                if (arr[i] > arr[i + 1]) {
   //当第i个数比i+1大,就交换,目的就是将最大的数字,往后一直排
                    swap(arr,i,i+1);
                }
            }
        }
    }

    public static void swap(int[] arr, int i, int j) {
   //交换数组内的数
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;

    }

二:选择排序
1.选择排序的时间复杂度是O(n^2),额外空间复杂度O(1)
2.选择排序的思想:每次找出最小值,放在最第一个位置,然后从第二个位置开始找,第二个最小值放在第二个位置,依次类推,最后一个值,就放在他自己的位置
3.选择排序的编程思路:与冒泡相似,第一层循环,从0递增到倒数第二个位置(只剩下两个数的时候,假设第一个数是最小值,那么就已经会遍历到最后一个位置,就已经将倒数第二个数字和最后一个进行了比较,所以不需要走到尽头,只剩下一个数字的时候,它一定是,剩余没有排的数字里的最小值,因为只有它了,在之前的循环里,我们能够保证在它之前的所有值都比它小),第一层循环内,假设初始位置就是最小值,第二层循环是从第一层循环设置的初始位置开始,往下直到最后一个数字,只要比假设的最小值小,就交换(放到初始位置),然后直到结束。
4.代码:

  public static void selectionSort(int[] arr) {
   
        if (arr == null || arr.length < 2) {
   
            return ;
        }//数组为空或者只有一个数字,直接返回

        for (int i = 0; i < arr.length - 1; i++
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值