java几种排序

Java的几种排序

    • 快速排序
    • 冒泡排序

快速排序

  • 核心思想:一个列表从中间切分,找到左边比中间大的数,右边找到比中间值小的数,然后调换位置,一次快排,以中间为界限会区分开来比中间值大的数和比中间值小的数。
  • 举个栗子,分拣按照重量分拣快递,在所有的快递中先选定一个快递质量为标准,比这个质量小的放左边,比这个质量大的放右边,一次下来,肯定是左边的快递比选定的这个质量小,右边选定的比这个质量大,左边的又取出来一个为标准,比取出来的这个小的放左边,比这个质量大的放右边,依次反复,那最左边的肯定就是最小的,最右边的肯定是最大的了。只不过快排中,这个标准是两个索引间的中间值而已。
public static void quickSort(int left, int right, List<Integer> array) {
        int l = left;
        int r = right;
        int pivot = array.get((left + right) / 2);
        int temp = 0;

        while (l < r) {

            // 从左点向中间遍历,直到找到比中间值大的,
            while (array.get(l) < pivot) {
                l += 1;
            }

            // 从右点向中间遍历,直到找到比中间值小的
            while (array.get(r) > pivot) {
                r -= 1;
            }
            //如果左右索引一样,只能说明左边没有一个数大于中间值,右边没有一个数小于中间值
            if (l == r) {
                break;
            }

            //左边找了大于中间数的,右边找到了下雨中间数的,左右调换位置
            temp = array.get(l);
            array.set(l, array.get(r));
            array.set(r, temp);

        }

        // 左右相等,只能说明左右的索引就是中间的索引
        if (l == r) {
            l += 1;
            r -= 1;
        }

        // 排序左边的
        if (left < r) {
            quickSort(left, r, array);
        }

        // 排完左边排右边
        if (right > l) {
            quickSort(l, right, array);
        }

    }

冒泡排序

  • 核心思想:从左往右两两进行比较,若两个数据中大的数据在左边,则左右进行调换下位置,这样一次排下来,最大的数据就在最右边了, data.length-1次就完全有序了。

看见没,这就是冒泡,最先出水面的水泡是最大的那个
java几种排序_第1张图片

  public static void bubbleSort(int[] data) {

        System.out.println("开始排序");
        int arrayLength = data.length;

        for (int i = 0; i < arrayLength - 1; i++) {

            boolean flag = false;
            
            for (int j = 0; j < arrayLength - 1 - i; j++) {
                // 左边值大于右边,调换位置
                if(data[j] > data[j + 1]){
                    int temp = data[j + 1];
                    data[j + 1] = data[j];
                    data[j] = temp;
                    flag = true;
                }
            }

            System.out.println(java.util.Arrays.toString(data));

            // 要是一次都没调换位置,只能说明,目前的数据已经是有序的了,没必要再进行下一次循环了
            if (!flag)
                break;
        }
    }

你可能感兴趣的:(java,排序算法)