排序应用

应用广泛:一旦建立数据库后,就可能根据某些需求对它进行排序。比如,对员工按工资排序,对学生按年级排序,对商品按价格排序,对城市按人口增长率排序,对国家按GDP排序,以及对恒星按大小排序。

重要性:由于排序非常重要而且可能非常耗时,所以它已经成为计算机科学中一个被广泛研究的课题。

排序的稳定性:如果具有相同关键字的数据项,经过排序它们的顺序保持不变,这样的排序就是稳定的。


冒泡排序

概述:冒泡排序算法最简单,但效率最低。

算法:1和2比较,2和3比较,3和4比较...,把最大的逐步冒泡到最顶端。

效率
比较次数:
假如一共有5个人比较高低,一共要比较4轮,第一轮要比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,总共需要比较4+3+2+1次。
这是一个有序数列,公式为(N-1+1)*(N-1)/2,即N*(N-1)/2,忽略1,N2/2
交换次数:
如果数字是随机的,大概有一半数据需要交换,即N2/4
交换和比较次数都和N2成正比,所以用大O表示法,冒泡排序表示为O(N2)

无论何时,只要看到双层循环,就可以怀疑这个算法的运行时间是O(N2)。外层循环N次,内部循环每次执行N次或几分之N次,这就意味着将大约需要N2次基本操作。

        int arrLength = arr.length;
        int temp = 0;
        // 假设一共有5个人比较个子高低
        // i的取值为最后一个需要比较大小的元素
        // 第一个轮回最后一次比较的两个数的第二个数的下标是4
        // 第二个轮回最后一次比较的两个数的第二个数的下标是3
        // 第三个轮回最后一次比较的两个数的第二个数的下标是2
        // 第四个轮回最后一次比较的两个数的第二个数的下标是1
        for (int i = arrLength - 1; i > 0; i--) {
            // 每一个轮回总是1和2比较,2和3比较,3和4比较...,所以j=0
            // 因为后面是j和j+1比较,所以j的最大取值范围是这一轮回最后一次比较时两个数的第一个数,也就是j < i
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
package MyTest;

import java.util.Arrays;
import java.util.Random;

public class OrderArray {
    public static void main(String[] args) {
        int[] arr = new int[]{100, 99, 56, 78, 50};
        //fill(arr);
        print(arr);
        println();
        sort(arr);
        print(arr);
    }

    private static void println() {
        System.out.println();
    }

    static void sort(int[] arr) {
        int arrLength = arr.length;
        int temp = 0;
        // 假设一共有5个人比较个子高低
        // i的取值为最后一个需要比较大小的元素
        // 第一个轮回最后一次比较的两个数的第二个数的下标是4
        // 第二个轮回最后一次比较的两个数的第二个数的下标是3
        // 第三个轮回最后一次比较的两个数的第二个数的下标是2
        // 第四个轮回最后一次比较的两个数的第二个数的下标是1
        for (int i = arrLength - 1; i > 0; i--) {
            // 每一个轮回总是1和2比较,2和3比较,3和4比较...,所以j=0
            // 因为后面是j和j+1比较,所以j的最大取值范围是这一轮回最后一次比较时两个数的第一个数,也就是j < i
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    static void fill(int[] arr) {
        Random random = new Random();
        for (int i = 0; i < 100; i++) {
            int num = random.nextInt(100);
            arr[i] = num;
        }
    }

    static void print(int[] arr) {
        for (int i = 0; i < 5; i++) {
            System.out.print(arr[i] + " | ");
        }
    }
}
View Code

相关文章:

  • 2021-07-13
  • 2022-01-17
  • 2022-12-23
  • 2021-08-11
  • 2021-11-02
  • 2021-09-07
猜你喜欢
  • 2021-08-08
  • 2020-07-18
  • 2021-10-07
相关资源
相似解决方案