./remake 算法 - 归并排序

归并排序是一种经典的分治算法,保证了相同元素的相对次序不变。它通过递归地将数组分为两半,分别排序,然后合并两个有序部分。在合并过程中使用双指针和额外空间来确保排序的稳定性。提供的C++代码示例展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

归并排序本质上也是一种分治算法(非常经典)。

  • 稳定排序:相同元素的相对次序在排序后不会发生变化

其基本流程如下:

  • 确定分界点:一般是中间点(l + r) / 2。
  • 递归排序左右区间。
  • 归并:将两个有序数组合并为一个有序数组。(双指针算法,需要借助额外空间,类似于数据库中根据两个Page的值将结果输出到另一个Page中去)

其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>

using namespace std;

const int N = 1e5 + 10;
int a[N], tmp[N];

void merge_sort(int *nums, int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(nums, l, mid);
merge_sort(nums, mid + 1, r);

int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r) {
if (nums[i] <= nums[j]) {
tmp[k++] = nums[i++];
} else {
tmp[k++] = nums[j++];
}
}

while (i <= mid) tmp[k++] = nums[i++];
while (j <= r) tmp[k++] = nums[j++];
for (i = l, k = 0; i <= r; i++, k++) {
nums[i] = tmp[k];
}
}

int main() {
int N;
cin >> N;

int nums[N];
for (int i = 0; i < N; i++) {
cin >> nums[i];
}

merge_sort(nums, 0, N - 1);

for (int i = 0; i < N; i++) {
cout << nums[i] << " ";
}
cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用JPA的EntityManager来进行插入操作,首先需要在实体类上添加@Entity注解,并且在实体类中添加对应的属性和getter/setter方法。例如,假设实体类为BillingWater: ``` @Entity @Table(name = "billingwater") public class BillingWater { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private BigDecimal balance; @Column(name = "billDate") private Date billDate; @Column(name = "feeType") private String feeType; @Column(name = "iOFlag") private String iOFlag; @Column(name = "iOmoney") private BigDecimal iOmoney; private String remake; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "brokerEnterpriseFeeId") private BrokerEnterprise brokerEnterprise; // 省略getter/setter方法 } ``` 然后可以在对应的Repository中定义插入方法,例如: ``` public interface BillingWaterRepository extends JpaRepository<BillingWater, Long> { @Modifying @Query(value = "insert into billingwater (balance,billDate,feeType,iOFlag,iOmoney,remake,brokerEnterpriseFeeId) " + "VALUES (:balance, :billDate, :feeType, :iOFlag, :iOmoney, :remake, :brokerEnterpriseFeeId)", nativeQuery = true) void insertBillingWater(@Param("balance") BigDecimal balance, @Param("billDate") Date billDate, @Param("feeType") String feeType, @Param("iOFlag") String iOFlag, @Param("iOmoney") BigDecimal iOmoney, @Param("remake") String remake, @Param("brokerEnterpriseFeeId") Long brokerEnterpriseFeeId); } ``` 然后在插入之前可以判断字段是否为空,例如: ``` if(StringUtils.isNotBlank(billingWaterDTO.getBrokerEnterprise().getId().toString()) && StringUtils.isNotBlank(billingWaterDTO.getFeeType()) && StringUtils.isNotBlank(billingWaterDTO.getiOFlag()) && billingWaterDTO.getiOmoney() != null) { // 执行插入操作 BillingWater billingWater = new BillingWater(); BigDecimal balance = entityManager.createNativeQuery("select balance - :iOmoney as balance from billingwater where brokerEnterpriseFeeId = :id order by id desc limit 0,1") .setParameter("iOmoney", billingWaterDTO.getiOmoney()) .setParameter("id", billingWaterDTO.getBrokerEnterprise().getId()) .getSingleResult(); billingWater.setBalance(balance); billingWater.setFeeType(billingWaterDTO.getFeeType()); billingWater.setiOFlag(billingWaterDTO.getiOFlag()); billingWater.setiOmoney(billingWaterDTO.getiOmoney()); billingWater.setRemake(billingWaterDTO.getRemake()); billingWater.setBrokerEnterprise(brokerEnterpriseRepository.findById(billingWaterDTO.getBrokerEnterprise().getId()).orElse(null)); if (billingWaterDTO.getBillDate() == null) { billingWater.setBillDate(new Date()); } else { billingWater.setBillDate(billingWaterDTO.getBillDate()); } billingWaterRepository.save(billingWater); } ``` 其中,使用EntityManager的createNativeQuery()方法执行原生SQL查询,然后获取查询结果并设置到实体类中,最后使用JpaRepository的save()方法进行保存操作。 需要注意的是,在使用JpaRepository进行插入操作时,需要在对应的方法上添加@Modifying注解和@Query注解,并且将nativeQuery属性设置为true,表示使用原生SQL语句进行操作。同时,在设置参数时需要使用@Param注解来指定参数的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值