快排代码实现

快排代码实现如下:

/**
 * 快排练习
 * @author Eleven
 * @version v1.0
 * @date 2021 2021/10/6  19:52
 */
public class FastSortExer {
    public static void main(String[] args) {
        int[] numbers = {4, 1, 2, 5, 7, 4, 8, 3, 8, 4, 5, 9, 7, 3, 1};
        fastSort(numbers, 0, numbers.length - 1);
        System.out.println(Arrays.toString(numbers));
    }

    /**
    * 快速排序练习
    * @param numbers 需要排序的数组
    * @param left 需要排序的范围的起始位置
    * @param right 需要排序的范围的结束位置
    * @date 2021/10/6 20:16
    */
    private static void fastSort(int[] numbers, int left, int right) {
        //递归出口,当起始位置大于结束位置,开始结束递归
        if (left >= right) return;

        //记录起始位置
        int start = left;
        //记录结束位置
        int end = right;
        //设定其实位置的元素作为目标元素,寻找该元素的正确位置
        int target = numbers[left];

        //开始寻找目标元素正确位置
        while (start != end) {
            //从后往前开始寻找,若发现比目标元素小的元素,将其放置start标记索引处
            while (start < end && numbers[end] >= target) end--;
            numbers[start] = numbers[end];

            //从前往后寻找,若发现比目标元素大的元素,将其放置end标记索引处
            while (start < end && numbers[start] <= target) start++;
            numbers[end] = numbers[start];
        }

        //寻找结束后,start标记与end标记的索引处即为目标元素的正确位置
        numbers[start] = target;

        //将目标元素左边与右边的元素分别进行排序
        fastSort(numbers, left, start - 1);
        fastSort(numbers, start + 1, right);


    }

}
### 如何高效解决 LeetCode 热门 100 题 #### 制定学习计划 为了高效完成 LeetCode 的热门题目,制定合理的学习计划至关重要。可以按照难度逐步提升的方式来进行练习,先从简单题入手,逐渐过渡到中等困难级别。 #### 掌握基础数据结构与算法 熟悉常用的数据结构(如栈、队列、哈希表等)以及经典算法(排序、查找),这有助于快速理解并解决问题[^1]。 对于给定的例子 `最长有效括号`,通过使用栈来追踪未匹配的左括号位置,并计算最大长度: ```cpp class Solution { public: int longestValidParentheses(string s) { int ans = 0; std::stack<int> stk; stk.push(-1); for (int i = 0; i < s.size(); ++i){ if (s[i] == '(') stk.push(i); else{ stk.pop(); if (stk.empty()) stk.push(i); else ans = std::max(ans, i - stk.top()); } } return ans; } }; ``` 另一个例子是移除有序数组中的重复项,这里采用双指针技巧提高效率: ```java public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int index = 0; for (int i = 1; i < nums.length; ++i) { if (nums[i] != nums[index]) { index++; nums[index] = nums[i]; } } return index + 1; } ``` 针对两数之问题,则可以通过构建哈希表实现线性时间复杂度内的求解方案: ```cpp std::vector<int> twoSum(std::vector<int>& nums, int target) { std::unordered_map<int, int> map; for (size_t i = 0; i < nums.size(); ++i) { auto it = map.find(target - nums[i]); if (it != map.end()) { return {static_cast<int>(it->second), static_cast<int>(i)}; } map[nums[i]] = i; } throw "No solution"; } ``` #### 多做总结归纳 每做完一道题之后都要认真思考其背后的原理技术要点,尝试寻找相似类型的其他题目加以巩固训练。同时也要注意积累一些常用的编程模式或模板以便日后调用。 #### 积极参与社区交流 加入讨论区与其他开发者互动交流心得体验,不仅可以拓宽视野还能及时获取最新的技术资讯发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值