Java基础-排序算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQ1142003960/article/details/50936501

1.冒泡排序

    /**
     * 冒泡排序算法
     * <p/>
     * 依次把第i个元素与 i+1到arr.length的元素进行比较,
     * 发现有比i更小(大)的元素的话,则进行位置替换
     * <p/>
     * 第i次遍历,保证i是 i+1到arr.length里面最小(大)的元素
     *
     * 时间复杂度O(n*n)
     */
    public void bubbleSort(int[] arr) {
        System.out.println("排序前:" + Arrays.toString(arr));
        int tmp;//临时变量,用于值交换
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    //如果arr[i]不是最小的,则把最小的放到i的位置
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
        System.out.println("排序后:" + Arrays.toString(arr));
    }

2.快速排序

     /**
     * 快速排序
     * 分治思想,大于idx的放右边,小于idx的放左边,保证idx是正确的位置,
     * 然后同时对i的左边和右边分别进行排序
     */
    public static void quickSort(int[] arr) {
        System.out.println("排序前:" + Arrays.toString(arr));
        sort1(arr, 0, arr.length - 1);
        System.out.println("排序后:" + Arrays.toString(arr));
    }

    //实现方式一
    public void sort1(int[] arr, int left, int right) {
        int low = left;//低位
        int high = right;//高位
        int key = arr[left];//当前寻找位置的key

        while (low < high) {
            while (low < high && arr[high] >= key) {
                high--;
            }

            if (low < high) {
                int temp = arr[high];
                arr[high] = arr[low];
                arr[low] = temp;
                low++;
                //位置交换完成后,低位需要加1,
                //因为arr[low]肯定是比key小,不需要再去比较
            }

            while (low < high && arr[low] <= key) {
                low++;
            }

            if (low < high) {
                int temp = arr[high];
                arr[high] = arr[low];
                arr[low] = temp;
                high--;
                //位置交换完成后,高位需要减1,
                //因为交换到高位的数值肯定比key大,不需要再去比较
            }
        }
        //while循环结束,此时,arr[low]的左边都比它小,右边都比arr[low]大
        //也就是说,arr[low]数值所在的位置肯定是争取的

        //继续对左边进行排序
        if (low > left) {
            sort1(arr, left, low - 1);
        }

        //继续对右边进行排序
        if (high < right) {
            sort1(arr, low + 1, right);
        }
    }

3.插入排序

    /**
     * 插入排序
     * 第i次循环保证 [0-i]的数据是有序的,然后第i个数继续加入到有序列表
     * 基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
     * 算法适用于少量数据的排序,时间复杂度为O(n^2)
     */
    public void insertionSort(int[] arr) {
        System.out.println("排序前:" + Arrays.toString(arr));
        for (int i = 1; i < arr.length; i++) {
            int curr = arr[i];//记住当前需要移动的数

            int j = i - 1;
            while (j >= 0 && arr[j] > curr) {//这里需要注意,每个数都与当前数比较,找到当前数的正确位置
                arr[j + 1] = arr[j];//数据复制
                j--;//如果不是正确的位置,--后继续找
            }
            //到这里,找到了正确的位置,进行交换
            arr[j + 1] = curr;
        }
        System.out.println("排序后:" + Arrays.toString(arr));
    }

猜你喜欢

转载自blog.csdn.net/QQ1142003960/article/details/50936501