使序列有序的最少交换次数

题目1:

给出一个序列,只交换相邻两数,使得序列升序排列,求出最少交换次数。

思路:

如果说只是交换相邻两个数字。那么就是这个序列的逆序数。

1.假设序列个数为n,我们先把最大的数换到最后,因为是相邻数字交换,所以把最大数交换到最后,需要交换的次数为最大数后的数字个数。

2.当完成最大数的交换后,可以将最大数从序列中划去不管了,即此时序列个数为n-1了,我们再在该序列中找到一个最大数,进行相同操作。

3.所以使整个序列有序的交换次数为,这个序列的所有逆序总数。

比如4,3,2,1。 
(4,3) (4,2) (4,1),有3个逆序,交换后 3,2,1,4 
(3,2) (3,1),有2个逆序,交换后2,1,3,4 
(2,1),有1个逆序,交换后1,2,3,4

用归并的方法写了个。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int cnt;
int arr[1005];
void Merge(int* arr,int* tmp,int left,int right,int rightEnd)
{
    int leftEnd = right - 1;
    int start = left;
    while (left <= leftEnd && right <= 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值