冒泡排序 和 选择排序

冒泡排序 

其实冒泡排序很好玩也很简单,来吧展示吧!

冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。
  冒泡排序的步骤是比较固定的:

算法思想:

1>比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2>每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。
3>针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较

 冒泡排序的常规实现代码如下:

/**
     * 冒泡排序
     */
    public static void main(String[] args) {
        Random random = new Random();
        int[] arr =new int[10];
        for (int i = 0; i <arr.length ; i++) {
            int n =random.nextInt(201);
            arr[i]=n;
        }
        System.out.println("随机0-200之间的数"+Arrays.toString(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]){
                    arr[j]=arr[j]^arr[j+1];
                    arr[j+1]=arr[j]^arr[j+1];
                    arr[j]=arr[j]^arr[j+1];
                }
            }
        }
        System.out.println("排列好的数:"+Arrays.toString(arr));
    }

应为我这边是定义的随机数生成所以就不展示输出效果图了。

冒泡排序有三种特性:

稳定性:

在冒泡排序中,遇到相等的值,是不进行交换的,只有遇到不相等的值才进行交换,所以是稳定的排序方式。

复杂度:

如果待排序序列的初始状态恰好是我们希望的排序结果(如升序或降序),一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
        
  冒泡排序最好的时间复杂度为O(n)。

  如果待排序序列是反序(如我们希望的结果是升序,待排序序列是降序)的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
        
  冒泡排序的最坏时间复杂度为O(n2)。
  综上,因此冒泡排序总的平均时间复杂度为O(n2)。

适用场景:

冒泡排序适用于数据量很小的排序场景,因为冒泡的实现方式较为简单。

选择排序

选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。
  步骤:

算法思想:

A.在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
B.从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
C.以此类推,直到所有元素均排序完毕。

选择排序法

 

public static void main(String[] args) {
            //定义一个0-200之间的随机数
            Random random = new Random();
            int[] arr =new int[4];
            for (int i = 0; i <arr.length ; i++) {
                int n =random.nextInt(201);
                arr[i]=n;
            }
            System.out.println("随机0-200之间的数"+ Arrays.toString(arr));

            //最外层循环
            for (int i = 0; i < arr.length-1; i++) {
                //获取index最小值位置
                int index=i;
                for (int j = i+1; j <arr.length ; j++) {
                    if(arr[index]>arr[j]){
                        index=j;
                    }
                }
                //判断是第一个数否是最大的,如果是就交换不是则不换
                if(index!=i){
                    arr[index]=arr[index]^arr[i];
                    arr[i]=arr[index]^arr[i];
                    arr[index]=arr[index]^arr[i];
                }
            }
            System.out.println("排完序的数"+ Arrays.toString(arr));
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值