★实验任务

给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次。 现在要 对排列 P 进行冒泡排序,代码如下:

for (int i = 1; i <= N; ++i) for (int j = N, t; j > i; ‐‐j) if (P[j ‐ 1] > P[j]) t = P[j], P[j] = P[j ‐ 1], P[j ‐ 1] = t;

在排序过程中,数字的位置可能会发生变化。对于 1~ N 的每个数字,你需 要输出过程中达到的最左位置下标和最右位置下标的差的绝对值。

★数据输入

第一行为 N,表示排列长度。 第二行为排列 P。 数据保证: 80%的数据,N <= 1000 100%的数据,N <= 100000

★数据输出

输出一行,第 i 个数字表示数字 i 最左与最右位置的差的绝对值。

测试样例

输入:

4

3 2 1 4

输出:2 1 2 0

解题思路:根据题目意思我们可以看出每个数的最左端和最右端的位置的差值的绝对值,而每个数向右移动多少只需要看右边有几个比他更小的数就可以,左端就只需要看最开始的位置和最终的位置的更小的值就可以,然后寻找每个数的后缀更小的数的个数以及对整个数组进行排序就可以通过归并排序的思想实现。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define MAX_SIZE 100005
using namespace std; int tmp[MAX_SIZE], num[MAX_SIZE], smaller[MAX_SIZE],loca[MAX_SIZE];
int sum = 0, n;
int min(int a, int b)
{
return a > b ? b : a;
} void Merge(int l,int r,int mid)
{
int i = l, j = mid + 1, k = l, sum = 0;
while (i <= mid&&j <= r)
{
if (num[i] > num[j])
{
// smaller[num[i]]++;
tmp[k++] = num[j++];
sum++;
}
else
{
smaller[num[i]] += sum;
tmp[k++] = num[i++];
}
}
while (i <= mid)
{
tmp[k++] = num[i];
smaller[num[i]] += sum; i++;
}
while (j <= r)
{
tmp[k++] = num[j++];
}
for (i = l; i <= r; i++)num[i] = tmp[i];
} void Merge_Sort(int l, int r)
{
if (l >= r)return;
int mid = (l + r) >> 1;
Merge_Sort(l,mid);
Merge_Sort(mid + 1, r);
Merge(l, r, mid);
} int main()
{
int i, j;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> num[i]; loca[num[i]] = i;
}
Merge_Sort(1, n);
for (i = 1; i <= n; i++)
{
printf("%d%c", loca[i]+smaller[i]-min(loca[i],i), i != n ? ' ' : '\n');
// printf("%d%c", num[i], i != n ? ' ' : '\n');
}
return 0;
}

解题感想:很久以前就对归并排序不是很清楚,一直没有好好的理清楚,现在趁着复习算法认真的理解研究了一下,用VS断点一步一步领会,同时对二分递归也有一个更好的理解。

同时分享一篇今天看到的挺好的文章,执行力很重要!

bubble_sort(归并排序)的更多相关文章

  1. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  2. C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序

    2018 3 17 今日总结一下C++中的排序算法: 1冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...

  3. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  4. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  5. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  6. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  7. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  8. 归并排序的java实现

    归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...

  9. JavaScript算法(归并排序与快速排序)

    归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的 ...

随机推荐

  1. VirtualBOX启动错误the vm session was closed before any attempt to power it on解决办法

    昨天晚上笔记本休眠后,今天早上启动vm时,报错了. 点击详细启动错误:the vm session was closed before any attempt topower it on. 解决办法: ...

  2. Kubernetes学习之路(四)之Node节点二进制部署

    K8S Node节点部署 1.部署kubelet (1)二进制包准备 [root@linux-node1 ~]# cd /usr/local/src/kubernetes/server/bin/ [r ...

  3. let和var定义变量的区别

    使用 let 语句声明一个变量,该变量的范围限于声明它的块中.  可以在声明变量时为变量赋值,也可以稍后在脚本中给变量赋值. 使用 let 声明的变量,在声明前无法使用,否则将会导致错误. 如果未在  ...

  4. [webapp]ios safari 正确使用js跳转

    在safari上,以往屡试不爽的location.href = url; 变得不好用了.使用该方法跳转到新的网页,无法使用后退按钮回到上个页面.想想也是,直接修改值得方式跳转总是怪怪的,但是从刚学网页 ...

  5. 公网API安全--OAuth认证

    之前写过一个基于签名的公网API访问安全控制,另一种方式是基于OAuth认证协议做安全控制. 说明 用户访问A客户端,使用B的服务及资源.B只有征得用户的授权,才允许A客户端使用B上用户的资源和服务. ...

  6. 最具有性价比的语言javascript之介绍篇

    虽然最近几年javascript很火.但很多程序员对javascript重视程度不够,所以对javascript的高级应用不甚了解.认为javascript仅仅只是一门脚本语言,作用就是表单验证,网页 ...

  7. 办公区公网Ip访问不到阿里云ECS

    办公区公网Ip访问不到阿里云ECS 工作中遇见这样的问题, Hadoop 部署在办公区内网, 而应用有些的数据在阿里云ECS主机中,现在hadoop 访问ECS 却访问不到ESC ,最终电话咨询阿里云 ...

  8. APP测试基本流程以及APP测试要点

    APP测试流程梳理 APP测试要点梳理 链接:http://pan.baidu.com/s/1gfaEZ1x 密码:07yt 1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开 ...

  9. IVF link error错误不显示的问题

      遇到一个奇怪的问题,IVF编译链接时显示error LINK: 后面没有具体的错误信息(见后图,我的窗口后面是空的)环境:windows 10 64位系统,VS2017 commutity 版本, ...

  10. jmeter汉化

    测试需要许多工具辅助工作,我们在使用这些工具之前需要对工具有一定的了解,第一步就是需要安装特定的软件. 因为工具基本上都是英文版的,所以菜鸟使用就面临汉化的问题,下面介绍几种汉化的办法: 一.万事不决 ...