• 排序算法-后续补充


    便于自己复习和查阅,特记录一下。

    1.冒泡排序(升序)

    思路:每一轮将连续两个数比较大小,如果后面的大于前一个,进行交换,每一轮冒泡均能找到一个最大的值;

         然后,比较的轮数是length-1-i,解释如下:每一轮产生的最大的都是固定的,所以要减去已经有序的个数,-1的意思是,i只循环到最后一个的前一个,与后一个进行比较就行了

     1    public static void bubbleSort(int[] array) {//冒泡排序
     2         int temp;
     3         for (int i = 0; i < array.length; i++) {//轮数
     4             for (int j = 0; j < array.length - i - 1; j++) {//每一轮比较的个数
     5                 if (array[j] > array[j + 1]) {
     6                     temp = array[j + 1];
     7                     array[j + 1] = array[j];
     8                     array[j] = temp;
     9                 }
    10             }
    11         }
    12     }

    2.快速排序算法(用递归)

    思路:找到一个基准值,一般用第一个值记为key,根据key的大小,将待排序元素分成两组,左边的数都小于key,中间为key,右边的值均大于key;

       用左右数组下标进行查找记i,j,先从后往前找找到第一个小于key的值,将i 对应的值覆盖,然后i++,向后找,找到第一个大于key的值,将j 对应值覆盖,最后找到基准值的为值,将key放入。然后进行递归。

        public static void qucikQuery(int[] array, int left, int right) {//快排  递归实现
            int key = array[left];//用来保存第i个值;
            int i = left;
            int j = right;
            if (left >= right) {
                return;
            }
            while (i < j) {
                while (i < j && array[j] > key)
                    j--;
                if (i < j) {//找到第一个大于key的值,进行交换
                    array[i] = array[j];
                }
                while (i < j && array[i] < key)
                    i++;
                if (i < j) {
                    array[j] = array[i];
                }
            }
            array[i] = key;
            qucikQuery(array, left, i - 1);
            qucikQuery(array, i + 1, right);
        }

    另一种快速排序

    public static void quickSort(int[] a, int left, int right) {
            if (left > right)
                return;
            int pivot = a[left];//定义基准值为数组第一个数
            int i = left;
            int j = right;
    
            while (i < j) {
                while (pivot <= a[j] && i < j)//从右往左找比基准值小的数
                    j--;
                while (pivot >= a[i] && i < j)//从左往右找比基准值大的数
                    i++;
                if (i < j)                     //如果i<j,交换它们
                {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
            a[left] = a[i];
            a[i] = pivot;//把基准值放到合适的位置
            quickSort(a, left, i - 1);//对左边的子数组进行快速排序
            quickSort(a, i + 1, right);//对右边的子数组进行快速排序
        }

    后续,会继续补充。

    一切美好的都是值得等待的。
  • 相关阅读:
    CF1290E Cartesian Tree
    【LeetCode】11. 盛最多水的容器
    【LeetCode】10. 正则表达式匹配
    【LeetCode】9. 回文数
    【LeetCode】8. 字符串转换整数 (atoi)
    【LeetCode】7. 整数反转
    【LeetCode】6. Z 字形变换
    【LeetCode】5. 最长回文子串
    【LeetCode】4. 寻找两个正序数组的中位数[待补充]
    【LeetCode】3. 无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/minghua-b/p/9537639.html
Copyright © 2020-2023  润新知