问题描述

给定一个 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

★注释
样例冒泡排序过程:
swap 2 1: 3 2 1 4 > 3 1 2 4
swap 3 1: 3 1 2 4 > 1 3 2 4
swap 3 2: 1 3 2 4 > 1 2 3 4

思路

  定义结构体,成员有:data(数据值、排序后下标)、pos(排序前下标)、num(当前数右边比它小的数)

  归并,过程中统计数右边比它小的数,更新num

  最大下标为pos+num,最小下标为data或pos

  PS:好像用树状数组做也可以,但是我不会╮(๑•́ ₃•̀๑)╭

code

 #include <stdio.h>
#include <stdlib.h> struct Node
{
int data;
int pos;
int num;
}; Node *buf; inline int max(int a, int b)
{
return a>b?a:b;
}
inline int min(int a,int b)
{
return a<b?a:b;
} void mergesort(Node *arr, int l,int r)
{
if(l>=r) return ;
if(l+==r)
{
if(arr[l].data > arr[r].data)
{
Node tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
arr[r].num++;
}
} int m = (l+r)/;
int i,j,k;
int num=;
mergesort(arr,l,m);
mergesort(arr,m+,r);
for(i=l;i<=r;i++) buf[i] = arr[i];
for(k=l,i=l,j=m+ ; k<=r; k++)
{
if(i>m)
{
arr[k] = buf[j++];
}
else if(j>r)
{
arr[k] = buf[i++];
arr[k].num += num;
}
else if(buf[i].data < buf[j].data)
{
arr[k] = buf[i++];
arr[k].num += num;
}
else
{
arr[k] = buf[j++];
num++;
}
}
} int main()
{
int i,j,k;
int n;
scanf("%d",&n);
Node *arr = (Node *)malloc(sizeof(Node)*(n+));
buf = (Node *)malloc(sizeof(Node)*(n+));
for(i=;i<=n;i++)
{
scanf("%d",&arr[i].data);
arr[i].pos = i;
arr[i].num = ;
}
mergesort(arr,,n);
for(i=;i<=n;i++)
{
if(i==)
printf("%d",arr[i].num+arr[i].pos-min(arr[i].data,arr[i].pos));
else
printf(" %d",arr[i].num+arr[i].pos-min(arr[i].data,arr[i].pos));
}
printf("\n"); free(arr);
free(buf);
return ;
}

数据结构_bubble_sort的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

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

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

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  8. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

随机推荐

  1. 455. Assign Cookies Add to List

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  2. Hat’s Words(字典树的运用)

    个人心得:通过这道题,对于树的运用又加深了一点,字典树有着他独特的特点,那个指针的一直转换着实让我好生想半天, 不得不佩服这些发明算法人的大脑. 这题的解决方法还是从网上找到的,还好算法是自己实现得, ...

  3. LeetCode Max Consecutive Ones II

    原题链接在这里:https://leetcode.com/problems/max-consecutive-ones-ii/ 题目: Given a binary array, find the ma ...

  4. python 图形化(Tkinter)

    python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.T ...

  5. 基于JDK1.7.0_80与JDK1.8.0_66做的分析

    JDK1.7中 使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode相同,或者hashcode取模后的结果相同(hash collis ...

  6. js中call apply方法的使用介绍

    js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...

  7. boot asio 非阻塞同步编程---非阻塞的accept和receive。

    boot asio 非阻塞同步编程---非阻塞的accept和receive. 客户端编程: #include<boost/timer.hpp> #include <iostream ...

  8. Anti-pattern(反模式)

    常见的与“直觉”相背离的 anti-pattern 产生的实际原因是我们没有深入全面地考虑问题. 即只关注到自己关心的方面,忽略了其他重要的.恰好起相反作用的因素. 所以这个“直觉”是不成熟.不全面的 ...

  9. dirs命令

    dirs命令显示当前目录栈中的所有记录(不带参数的dirs命令显示当前目录栈中的记录).dirs始终显示当然目录, 再是堆栈中的内容:即使目录堆栈为空, dirs命令仍然只显示当然目录. 语法 dir ...

  10. linux 学习 端口占用 && 内存使用

    安装: apt-get update apt-get install net-tools Linux上:netstat -anop | grep ':50001' windows上:netstat - ...