Java常用排序算法

排序算法冒泡排序选择排序插入排序、堆排序、归并排序、计数排序、基数排序、桶排序、快速排序

-冒泡排序
基本思想
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,
让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

在这里插入图片描述
代码实现

    /**
     * 冒泡排序
     * 基本思想:
     * 在要排序的一组数中,对当前还未排好序的范围内的全部数,
     * 自上而下对相邻的两个数依次进行比较和调整,
     * 让较大的数往下沉,较小的往上冒。
     * 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
     * <p>
     * 第一轮:找到了最大值
     * 第二轮:找到次最大值
     * 有n个数据,比(n-1)次比完
     * for循环嵌套 :外循环控制行,内循环控制列
     * a[j] > a[j + 1] :从小到大
     * a[j] < a[j + 1]:从大到小
     */
    public void bubbleSort() {
        int a[] = {49, 2, -16, 5, 7, 23, 45, 67, 76, 78, 35, 55, 54, 59, 36, 43, 82, 88, 41, 60, 70, 80};
        int temp = 0;
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = 0; j < a.length - 1 - i; j++) {//j < a.length - 1 也可以,不过多比较了,影响性能
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        //遍历数组
        for (int arr : a) {
            Log.e("TAG", "冒泡排序:" + arr);
        }
    }
  • 选择排序
    基本思想
    在要排序的一组数中,选出最小的一个数与第一个位置的数交换
    然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
    缺点:在每趟比较过程中,一旦发现某个元素比第1位的元素小,就交换它们,但这是没必要的,徒增了交换的次数。
    优化:选择排序的核心是,在每趟比较中,找到本趟中最小的元素放在本趟比较的第1个位置,所以选择排序的每趟比较只需要交换一次即可,只要找到本趟比较中最小的元素和本趟比较中第1位置的元素交换即可
    在这里插入图片描述
    文字描述:
    第1趟比较:拿第1个元素依次和它后面的每个元素进行比较,如果第1个元素大于后面某个元素,交换它们,经过第1趟比较,数组中最小的元素被选出,它被排在第一位
    第2趟比较:拿第2个元素依次和它后面的每个元素进行比较,如果第2个元素大于后面某个元素,交换它们,经过第2趟比较,数组中第2小的元素被选出,它被排在第二位

    第n-1趟比较:第n-1个元素和第n个元素作比较,如果第n-1个元素大于第n个元素,交换它们

代码实现

    /**
     * 选择排序:
     * 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
     * 然后在剩下的数当中再找最小的与第二个位置的数交换,
     * 如此循环到倒数第二个数和最后一个数比较为止。
     * <p>
     * 文字叙述过程:
     * 第1趟比较:拿第1个元素依次和它后面的每个元素进行比较,
     * 如果第1个元素大于后面某个元素,交换它们,经过第1趟比较,
     * 数组中最小的元素被选出,它被排在第一位
     * 第2趟比较:拿第2个元素依次和它后面的每个元素进行比较,
     * 如果第2个元素大于后面某个元素,交换它们,经过第2趟比较,
     * 数组中第2小的元素被选出,它被排在第二位
     * ......
     * 第n-1趟比较:第n-1个元素和第n个元素作比较,如果第n-1个元素大于第n个元素,交换它们
     */
    public void selecrSort() {
        int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
        for (int i = 0; i < num.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < num.length; j++) {
                if (num[i] > num[j]) {
                    minIndex = num[j] < num[minIndex] ? j : minIndex;
                    //                    int temp = num[j];
                    //                    num[j] = num[i];
                    //                    num[i] = temp;
                }
            }
            int temp = num[i];
            num[i] = num[minIndex];
            num[minIndex] = temp;
        }

        //遍历数组
        for (int arr : num) {
            Log.e("TAG", "选择排序:" + arr);
        }
    }

插入排序
基本思想
在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,
使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
在这里插入图片描述
最好的情况下,即待排序序列按关键字已经有序排列,每趟操作只需1次或者0次移动
在最坏的情况下,即待排序序列按关键字逆排序序列,这时在第j趟操作中,为插入元素需要同前面的j个元素进行j次关键字比较,移动元素的次数为j+1次。此时有:总比较次数=n(n-1)/2次,总移动次数 = (n+2)(n-1)/2次
平均情况下:即在第j趟操作中,插入记录大约需要时间同前面的j/2个元素进行关键字比较,移动记录次数j/2+1次

代码实现

   /**
     * 插入排序:
     * 给你一个无序的数组,或者一段需要排序的序列,
     * 我们通常用第一个元素作为参考值,
     * 从第二个元素开始和这个参考值进行比较,
     * 比这个参考值大的时候放在这个参考值的后面,
     * 比这个参考值小的时候在和这个参考值的前一位进行比较,
     * 当比较至适当位置进行插入
     */
    public void insertSort() {
        int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
        int temp;
        //将第一个值看做一个有序序列
        for (int i = 1; i < num.length; i++) {
            temp = num[i];
            //如果前一位(已排序的数据)比当前数据要大,那么就进入循环比较[参考第二趟排序]
            while (i >= 1 && num[i - 1] > temp) {
                //往后退一个位置,让当前数据与之前前位进行比较
                num[i] = num[i - 1];
                //不断往前,直到退出循环
                i--;
            }
            //退出了循环说明找到了合适的位置了,将当前数据插入合适的位置中
            num[i] = temp;
        }
        //遍历数组
        for (int arr : num) {
            Log.e("TAG", "插入排序:" + arr);
        }
    }

更多关于冒泡排序,选择排序、插入排序的
冒泡排序:
https://blog.csdn.net/qq_41679818/article/details/90296399
https://blog.csdn.net/NathanniuBee/article/details/83413879
选择排序:
https://blog.csdn.net/u011109881/article/details/80038573
插入排序:
https://blog.csdn.net/weixin_43956598/article/details/90181567
https://blog.csdn.net/qq_28081081/article/details/80594386

发布了17 篇原创文章 · 获赞 31 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章