★实验任务

给定一个 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. 通过yum安装MySQL5.7.4

    1,进入yum的repo文件夹 cd /etc/yum.repos.d 2,mysql主页已经提供了centos等系统需要的rpm文件,直接去主页下载. 我用的centos6.5,选择Red Hat ...

  2. 【转】SQL中的锁、脏读、不可重复的读及虚读

    原文:http://blog.csdn.net/wjeson/article/details/9382067 锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题 ...

  3. Oracletop10物理段

    Oracletop10物理段 select owner, name, type, mega, tbs from (select owner, case when segment_type = 'LOB ...

  4. 3 huigu

    w   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 组件复用 --------------- ...

  5. #6435. 「PKUSC2018」星际穿越

    考场上写出了70分,现在填个坑 比较好写的70分是这样的:(我考场上写的贼复杂) 设\(L(i)=\min_{j=i}^nl(j)\) 那么从i开始向左走第一步能到达的就是\([l(i),i-1]\) ...

  6. Kali Linux 下安装中文版输入法

    1.更新软件源: 修改sources.list文件: vim /etc/apt/sources.list 或者 leafpad /etc/apt/sources.list 然后选择添加以下源: deb ...

  7. Scrapy中的POST请求发送和递归爬取

    POST请求发送 重写爬虫应用文件中继承Spider类的 类的里面的start_requests(self)这个方法 def start_requests(self): #请求的url post_ur ...

  8. 微信小程序自定义 tabbar

    一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tab ...

  9. XGB算法梳理

    学习内容: 1.CART树 2.算法原理 3.损失函数 4.分裂结点算法 5.正则化 6.对缺失值处理 7.优缺点 8.应用场景 9.sklearn参数 1.CART树 CART算法是一种二分递归分割 ...

  10. ubuntu下import matplotlib错误解决办法

    环境:ubuntu16.04,python2.7,tensorflow1.4.0 问题: ImportError: No moudule named _tkinter, please install ...