OJ常用技巧-排序

这篇博客主要介绍了在OJ(在线判题)中,C/C++、Java和Python三种编程语言进行排序的常见技巧。对于C/C++,提到了使用qsort函数以及STL中的sort;在Java部分,虽然未详细展开,但通常会涉及到内置的排序方法;Python部分同样提及,暗示可能有内置的排序库或函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OJ常用技巧-排序

1. C/C++

  • qsort
#include <stdlib.h>
#include <limits.h>

int compare_ints(const void* a, const void* b) {
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
    // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
    // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)
}

int main(void) {
    int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
    int size = sizeof ints / sizeof *ints;
    qsort(ints, size, sizeof(int), compare_ints);
}
  • STL - sort
#include <algorithm>
#include <functional>
#include <array>

int main() {
    std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};

    // sort using the default operator<, Ascending Order
    std::sort(s.begin(), s.end());

    // sort using a standard library compare function object, Descending Order
    std::sort(s.begin(), s.end(), std::greater<int>());

    // sort using a custom function object
    struct {
        bool operator()(int a, int b)
        {
            return a < b;
        }
    } customLess;
    std::sort(s.begin(), s.end(), customLess);

    // sort using a lambda expression
    std::sort(s.begin(), s.end(), [](int a, int b) {
        return b < a;
    });
}

2. Java

import java.util.Comparator;

import java.util.ArrayList;

import java.util.List;
import java.util.Arrays;
import java.util.Collections;

public class Main {

    public static void main(String[] args) {

        List<Integer> s =
            new ArrayList<Integer>(Arrays.asList(5, 7, 4, 2, 8, 6, 1, 9, 0, 3));

        // 使用 Integer 类自带的 Comparator 接口实现的 compareTo() 方法。
        // 如果没有默认实现则会报错。Ascending Order
        Collections.sort(s);

        // 使用自定义,通过匿名类的方式实现的Comparator接口, 同时调用reversed()方法。
        // Descending Order.
        Collections.sort(s, new Comparator<Integer>() {
                                @Override
                                public int compare(Integer a, Integer b) {
                                    return a.compareTo(b);
                                }
                            }.reversed());

        // 使用静态方法的引用来排序, Ascending Order
        s.sort(Integer::compareTo);

        // 使用 Lambda 表达式,简化Comparator的实现, Descending Order
        s.sort((a, b) -> b.compareTo(a));

        for (int n : s) { System.out.print(n+", "); } System.out.println();

    }

}

3. Python

# -*- coding: utf-8 -*-

data = [('a', 5), ('c', 7), ('b', 4), ('g', 2), ('h', 8),
        ('e', 6), ('i', 1), ('f', 9), ('j', 0), ('d', 3)]
# 默认按 Tuple 的第一个元素升序排列
data.sort()
# 按 Tuple 的第一个元素降序排列
data.sort(reverse=True)
# 按 Tuple 的第二个元素升序排列
data.sort(cmp=lambda x, y: x[1] - y[1])
# 按 Tuple 的第二个元素降序排列
data.sort(cmp=lambda x, y: x[1] - y[1], reverse=True)
### 关于东北大学 OJ 数据结构 第8章 习题2 的分析 目前并未提供具体的题目描述或官方解答,因此无法直接给出第8章习题2的具体解法。然而,基于常见的数据结构课程内容以及可能涉及的知识点[^1],可以推测该题目可能考察的内容范围。 #### 常见的数据结构知识点 在数据结构的学习过程中,第八章通常会涉及到较为复杂的主题,例如图、树或者高级动态规划等内容。以下是几个可能的方向: 1. **图算法** 如果题目与图有关,则可能是最短路径问题(如Dijkstra算法)、最小生成树(Kruskal或Prim算法),或者是拓扑排序等问题。以下是一个简单的Dijkstra实现示例: ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 priority_queue = [(0, start)] while priority_queue: current_distance, current_node = heapq.heappop(priority_queue) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances ``` 2. **树的操作** 若题目涉及树的遍历或操作转换,可能会要求将树上的查询转化为区间操作,类似于引用中的E题提到的方法。这种情况下,常用技巧包括DFS序、线段树或其他分治策略。 3. **动态规划** 动态规划也是常见考点之一,尤其是当题目需要优化复杂度时。如果题目类似F题所提及的0/1背包问题,则可以通过状态转移方程解决: ```python def knapsack(weights, values, capacity): dp = [0] * (capacity + 1) for i in range(len(weights)): for j in range(capacity, weights[i]-1, -1): dp[j] = max(dp[j], dp[j - weights[i]] + values[i]) return dp[-1] ``` 由于具体题目未明,以上仅为假设性的方法展示。建议查阅东北大学OJ平台的实际题目描述以获取更精确的信息。 #### 如何进一步确认? 为了获得确切答案,可尝试访问东北大学OJ官网并查找对应章节的练习题集。此外,也可以通过联系授课教师或参考教材来了解详细背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值