当前位置: 首页 > article >正文

力扣刷题篇之排序算法

系列文章目录



前言

 本系列是个人力扣刷题汇总,本文是排序算法。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode)

这个之前写的左神的课程笔记里也有: 左程云算法与数据结构代码汇总之排序(Java)-CSDN博客

本来想看 按照这个分类一个个解题的,但是好多都不是最优解甚至会超过时间限制,所以要看较为系统一点的排序算法还是看上面那个之前的汇总吧,只是没有希尔排序,看看这个: 

【算法】排序算法之希尔排序 - 知乎 (zhihu.com)

其实我有个想法,之后可以看看各个库里面的排序算法里面的源码怎么写的,因为老是想偷懒。。。。 


排序的一些基本题

912. 排序数组 - 力扣(LeetCode)

这里虽然写的冒泡排序,但是超出时间复杂度了

冒泡:

class Solution {
    public int[] sortArray(int[] nums) {
        bubbleSort(nums);
        return nums;
    }

    private void bubbleSort(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (nums[j] > nums[j + 1]) {
                    // Swap nums[j] and nums[j + 1]
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }
    }
}

同样,快排也超过了,很离谱

class Solution {
    public int[] sortArray(int[] nums) {
        quickSort(nums, 0, nums.length - 1);
        return nums;
    }

    private void quickSort(int[] nums, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(nums, low, high);
            quickSort(nums, low, pivotIndex - 1);
            quickSort(nums, pivotIndex + 1, high);
        }
    }

    private int partition(int[] nums, int low, int high) {
        int pivot = nums[high];
        int i = low - 1;

        for (int j = low; j < high; j++) {
            if (nums[j] < pivot) {
                i++;
                swap(nums, i, j);
            }
        }

        swap(nums, i + 1, high);
        return i + 1;
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

希尔排序

可以看【算法】排序算法之希尔排序 - 知乎 (zhihu.com)

public class Solution {
    /**
     * 使用希尔排序对整数数组进行升序排序。
     *
     * @param nums 待排序的整数数组
     * @return 升序排序后的数组
     */
    public int[] sortArray(int[] nums) {
        shellSort(nums);
        return nums;
    }

    /**
     * 希尔排序算法的具体实现。
     *
     * @param arr 待排序的整数数组
     */
    private void shellSort(int[] arr) {
        // 初始化步长
        int step = arr.length;
        step = step >> 1;

        // 根据步长进行希尔排序
        while (step >= 1) {
            for (int count = 0; count < step; count++) {
                // 对每个子数组进行插入排序
                for (int i = step + count; i < arr.length; i += step) {
                    int insert = i;
                    int temp = arr[insert];

                    // 插入排序
                    while (insert > step - 1 && temp < arr[insert - step]) {
                        arr[insert] = arr[insert - step];
                        insert -= step;
                    }
                    arr[insert] = temp;
                }
            }
            // 更新步长
            step = step >> 1;
        }
    }
}

215. 数组中的第K个最大元素 - 力扣(LeetCode)

 还得是快排

class Solution {
    public int findKthLargest(int[] nums, int k) {
        return quickSelect(nums, 0, nums.length - 1, nums.length - k);
    }

    private int quickSelect(int[] nums, int left, int right, int target) {
        int index = partition(nums, left, right);
        if (index == target) {
            return nums[index];
        } else {
            return index > target ? 
                quickSelect(nums, left, index - 1, target) : 
                quickSelect(nums, index + 1, right, target);
        }
    }

    private int partition(int[] nums, int left, int right) {
        swap(nums, left, left + new Random().nextInt(right - left + 1));
        int pivot = nums[left];
        while (left < right) {
            while (left < right && nums[right] > pivot) {
                right--;
            }
            if (left < right) {
                nums[left++] = nums[right];
            }
            while (left < right && nums[left] < pivot) {
                left++;
            }
            if (left < right) {
                nums[right--] = nums[left];
            }
        }
        nums[left] = pivot;
        return left;
    }

    private void swap(int[] nums, int i, int j) {
        int swap = nums[i];
        nums[i] = nums[j];
        nums[j] = swap;
    }
}


总结

还有几题之后补吧。


http://www.kler.cn/a/146529.html

相关文章:

  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • 软件设计大致步骤
  • Spring Boot 动态表操作服务实现
  • “扣子”开发之四:与千帆AppBuilder比较
  • level(三) filterblock
  • (STM32笔记)十二、DMA的基础知识与用法 第二部分
  • web静态网页设计与制作-基于HTML+CSS+JS实现旅游摄影网站
  • Maven总结
  • python树的孩子链存储结构
  • C#每天复习一个重要小知识day10:静态类
  • Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法
  • LLM之Agent(二):BabyAGI的详细教程
  • 【华为OD】B\C卷真题:100%通过:整型数组按个位值排序 C/C++实现
  • 精进Beautiful Soup 小技巧(三)---综合提供效率(缓存/error/多线程/异步)
  • c语言-冒泡排序
  • C#文件基本操作(判断文件是否存在、创建文件、复制或移动文件、删除文件以及获取文件基本信息)
  • 四、IDEA创建项目时,Maven Archetype模板工程说明
  • P18 C++ 继承
  • Rust语言入门教程(四) - 数据类型
  • 案例034:基于微信小程序的课堂助手系统
  • app自动化测试接口文档与在线测试
  • LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  • 基于C#实现奇偶排序
  • sql 动态语句
  • vue+springboot读取git的markdown文件并展示
  • Camtasia Studio2024专业的屏幕录制和视频剪辑软件