Java排序算法之贪心算法

贪心算法是一种优化问题的解决方法,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最优的。贪心算法常用于最优化问题,比如最小生成树、哈夫曼编码、最短路径等。贪心算法是一种简单而有效的算法,它不需要对问题的所有情况进行全局搜索,可以在较短时间内得到较优解。但是,由于贪心算法仅考虑局部最优解,可能导致无法得到全局最优解。因此,在使用贪心算法时需要对问题进行分析,判断贪心策略是否可行。

贪心算法是一种常见的算法思想,特点是每次决策选择当前状态下最优的解,而不考虑未来可能的影响。在实际应用中,贪心算法通常用于求解最优化问题,比如背包问题、最短路径问题、任务调度问题等。

下面是一个简单的Java实现,以求解背包问题为例:

java 复制代码
public class GreedyAlgorithm {

    /**
     * 背包问题,贪心算法实现
     * @param weights 物品重量
     * @param values 物品价值
     * @param capacity 背包容量
     * @return 最大价值
     */
    public static int knapsack(int[] weights, int[] values, int capacity) {
        int n = weights.length;
        // 将物品按照单位价值从大到小排序
        Item[] items = new Item[n];
        for (int i = 0; i < n; i++) {
            items[i] = new Item(weights[i], values[i], i);
        }
        Arrays.sort(items, (a, b) -> {
            return b.valuePerWeight - a.valuePerWeight;
        });

        int maxVal = 0;
        int curCap = capacity;
        // 依次选择单位价值高的物品,直至背包装满
        for (int i = 0; i < n && curCap > 0; i++) {
            int idx = items[i].idx;
            int w = weights[idx];
            int v = values[idx];
            if (w <= curCap) {
                maxVal += v;
                curCap -= w;
            } else {
                maxVal += v * curCap / w;
                curCap = 0;
            }
        }
        return maxVal;
    }

    /**
     * 物品类
     */
    private static class Item {
        int weight;
        int value;
        int idx;
        int valuePerWeight;

        public Item(int weight, int value, int idx) {
            this.weight = weight;
            this.value = value;
            this.idx = idx;
            this.valuePerWeight = value / weight;
        }
    }
}

在这个实现中,我们首先将所有物品按照单位价值从大到小排序,然后依次选择单位价值高的物品,直至背包装满。这个算法的时间复杂度为O(n\\log n),其中n为物品的数量。

相关推荐
wabs6661 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing2 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi20262 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog3 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt4 小时前
自制交叉线路识别算法
算法
手写码匠4 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区5 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人6 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin037 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC7 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode