bubble_sort(归并排序)
★实验任务
给定一个 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(归并排序)的更多相关文章
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
- C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序
2018 3 17 今日总结一下C++中的排序算法: 1冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...
- 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现
首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- 归并排序的java实现
归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...
- JavaScript算法(归并排序与快速排序)
归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的 ...
随机推荐
- HTTP协议图
- Scratch 3.0 版本比较
新年伊始MIT 就正式 发布了Scratch最新3.0版 ,以 HTML5.0 为基础的版本! 本文就来带看看3.0版有哪些更新的地方. 下图是进入后第一个画面,跟Scratch 2.0 很像,熟悉的 ...
- Nginx-------Nginx的安装和多域名配置
Nginx安装 centos6.x yum默认没有nginx的软件包 安装方式: 到nginx下载页面http://nginx.org/en/linux_packages.html#stable,复制 ...
- springboot热部署(一)——Java热部署与热加载原理
一.概述 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说, 热部署就是在服务器运行时重新部署项目,——生产环境 热加载即在在运行时重新加载class,从而 ...
- 洛谷 P1580 yyy loves Easter_Egg I
洛谷 P1580 yyy loves Easter_Egg I 题解: 队列+字符串 #include <cstdio> #include <string> #include ...
- 牛客练习赛31 D 最小相似度
最小相似度 链接 分析: 转化为求1的个数,这样两个串不同的位置的个数就是1的个数.那么对于一个二进制串x,它的贡献就是max{x与s[i]异或后0的个数}=>max{m-x与s[i]异或后1的 ...
- CentOS 7 安装 caffe
1.安装CUDA,很简单,傻瓜式安装 2.http://caffe.berkeleyvision.org/install_yum.html 按照里面安装 3.遇到的问题: LD -o .build_r ...
- [ONTAK2010]Peaks kruskal重构树,主席树
[ONTAK2010]Peaks kruskal重构树练手题. LG传送门竟然不强制在线?看到离线水过很不爽:B站强制在线版传送门 看到"询问从点\(v\)开始只经过困难值小于等于\(x\) ...
- Python爬虫入门 之 如何在豆瓣中获取自己喜欢的TOP N电影信息
什么是爬虫 按照一定规则自动的获取互联网上的信息(如何快速有效的利用互联网上的大量信息) 爬虫的应用 搜索引擎(Google.百度.Bing等搜索引擎,辅助人们检索信息) 股票软件(爬取股票数据,帮助 ...
- AltiumDesigner 热焊盘铺铜
在layout中,引脚与大面积的铺铜完全连接容易造成过分散热而产生虚焊以及避免因过分散热而必须使用大功率焊接器,因此在大面积铺铜时,对于接地引脚,我们经常使用热焊盘.在AltiumDesigner 中 ...