排序算法之冒泡排序、选择排序、直接插入排序(java实现)

今天用java实现三个简单的排序算法:冒泡排序、选择排序、直接插入排序。

1.冒泡排序

冒泡排序过程:从前完后依次比较,将最大的数放到最后,重新开始前面的过程,将第二大的数放到倒数第二的位置,直到数组有序。

最开始有一个Test类用于获得要排序的数组,里面有两个函数Input(用于用于自己输入数组)和getRandomInput(用于随机获得用户想要个数的数组),这样可以比较好的测试,以后用到排序的时候都使用这个方法获取要排序的数组:

public class Test {
    //通过scan一个一个读入数据,获取输入的数组
    public List Input() {
        List list = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        int length = 0;//数组长度
        System.out.print("输入数组长度:");
        length = scanner.nextInt();
        System.out.print("输入排序数组:");
        int count = 0;
        while (length != count) {
            list.add(scanner.nextInt());
            count++;
        }

        System.out.print("输入的数组为:");
        for (int j = 0; j < list.size(); j++) {
            System.out.print(list.get(j) + " ");
        }
        return list;
    }

    public List getRandomInput() {
        List list = new ArrayList<>();
        System.out.print("输入随机数个数:");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.print("sort before:");
        boolean flag;
        int a;
        for (int i = 0; i < n; i++) {
            flag = true;
            //while循环是为了保证随机到的数组没有重复的,不然有时候如果范围比较小的下,重复比较高,这个并不影响,大家可以自行修改
            while (flag) {
                a = new Random().nextInt(100);
                if (i == 0) {
                    list.add(a);
                    System.out.print(a + " ");
                    flag = false;
                } else {
                    for (int j = 0; j < list.size(); j++) {
                        //判断list中是否存在a,如果不存在 就加入到list中
                        if ((int) list.get(j) == a) {
                            flag =true;
                            break;
                        }
                        flag = false;
                    }
                    if(!flag){
                        list.add(a);
                        System.out.print(a + " ");
                    }
                }
            }
        }
        System.out.print("\n");
        return list;
    }
}

这里解释一个问题,没有用到一般的数组,用到的是List,其实都是一样的,两个的区别简单一点说就是数组长度不能变,而List长度是可以变的。

冒泡排序java代码:

public class BubbleSort {
    public static void main(String[] args) {
        Test test = new Test();
        List list = test.getRandomInput();
        int n = list.size();
        int i = 0;
        int j = 0;
        int k = 0;
        int count = 1;
        while ((n - 1) > 0) {
            i = 0;
            j = i + 1;
            while (j != n) {
                if ((int)list.get(i) > (int)list.get(j)) {
                    k = (int) list.get(j);
                    list.set(j, list.get(i));
                    list.set(i, k);
                                    }
                i = j;
                j++;
            }
            System.out.print("第" + count + "趟排序结果:");
            for (int m = 0; m < list.size(); m++) {
                if(m  == (list.size()-count)){
                    System.out.print("{" + list.get(m) + "} ");
                }else System.out.print(list.get(m) + " ");
            }
            System.out.println();
            count++;
            n--;
        }
    }
}

测试结果:



2.选择排序

选择排序过程:每次从待排序的数组中选出最小或者最大的数,放到有序数组的最后面,当所有的数选择完之后就是有序的了

选择排序java代码:

public class SelectionSort {
    public static void main(String[] args) {
        SelectionSort selectionSort = new SelectionSort();
        Test test = new Test();
        List list = test.getRandomInput();
        int n = list.size();
        int min = 0;//保存最小值
        int position = 0;//保存最小值位置
        int k = 0;
        for (int i = 0; i < n; i++) {
            min = (int) list.get(i);
            position = i;
            for (int j = i; j < n; j++) {
                if (min > (int) list.get(j)) {
                    min = (int) list.get(j);
                    position = j;
                }
            }
            k = (int) list.get(position);
            list.set(position, list.get(i));
            list.set(i, k);
            selectionSort.Print(list, n);
        }
    }

    public void Print(List list, int n) {
        System.out.print("sort after:");
        for (int i = 0; i < n; i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    }
}

测试结果:


3.直接插入排序

直接插入排序过程:每次从待排序的数组中选择第一个,放到前面已经有序的数组里面,从后往前依次比较,保证有序插入,重复上面的操作指导所有的数有序。

直接插入排序java代码:

public class InsertionSort {
    public static void main(String[] args){
        Test test = new Test();
        List list = test.getRandomInput();

        int k=0;
        int position=0;
        for(int j =1;j<list.size();j++){
            position =j;
            for(int i = j-1;i>=0;i--){
                if((int)list.get(position) < (int)list.get(i)){
                    k = (int)list.get(position);
                    list.set(position,list.get(i));
                    list.set(i,k);
                    position = i;
                }
            }
            System.out.print("sort after "+j+" :");
            for(int i =0;i<list.size();i++){
                System.out.print(list.get(i)+" ");
            }
            System.out.println();
        }
    }
}

测试结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值