uva 10327 相邻数字交换排序法
2016-09-08 00:37
281 查看
//
// main.cpp
// data structure
//
// Created by 戴之阳 on 16/9/7.
// Copyright © 2016年 sky.dai. All rights reserved.
//
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<math.h>
using namespace
std;
//逆序法
笔记
/*
1、逆序。一般认为从左向右序列的数字增大认为是正序的,那么从左到右序列的序列数字出现减小就认为是逆序的。一个“逆序”的数学定义是这样的,如果存在正整数
i, j 使得 1 ≤ i < j ≤ n
而且 A[i] > A[j],则 <A[i], A[j]>
这个有序对称为 A
的一个逆序,又称作一个逆序对。
2、逆序数。整个序列中的逆序对的个数叫做序列的逆序数。
3、逆序列。逆序列是表示序列逆序属性的一个序列,其定义是这样的,逆序列中的某一项aj表示原序列中的第二成分(左边成分)为j的逆序对的个数。逆序列中的j需要从小到大正序排列,这样子组成的序列就叫作逆序列。显然,逆序列各项之和也是序列的逆序数。
排序方法:
首先,根据待排序列,写出其逆序列。
然后,根据逆序列中的每一项所代表的数j和逆序个数aj,将待排序列中对应的数j向左邻交换aj次。
那么,交换完成后,序列就排序完成。此时,交换的次数就是最少的次数,也是原序列的逆序数。
原序列: 4 8 2 7 5 6 1 3
逆序对有:
(4,2), (4,1), (4, 3),
(8,2), (8,7), (8,5), (8,6), (8,1), (8,3),
(2,1),
(7,5), (7,6), (7,1), (7,3),
(5,1), (5,3),
(6,1), (6,3),
逆序数为18
逆序列为:6 2 5 0 2 2 1 0
*/
int main()
{
int num,i;
int arr[10001];
while(cin>>num)
{
int count =
0;
for( i=0;i<num;i++)
cin>>arr[i];
for(i=0;i<num-1;i++)
for(int j=i+1;j<num;j++)
if(arr[i]>arr[j])
count++;
cout<<"Minimum exchange operations : "<<count<<endl;
//由题意直接求出逆序对个数即可
}
}
// main.cpp
// data structure
//
// Created by 戴之阳 on 16/9/7.
// Copyright © 2016年 sky.dai. All rights reserved.
//
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<math.h>
using namespace
std;
//逆序法
笔记
/*
1、逆序。一般认为从左向右序列的数字增大认为是正序的,那么从左到右序列的序列数字出现减小就认为是逆序的。一个“逆序”的数学定义是这样的,如果存在正整数
i, j 使得 1 ≤ i < j ≤ n
而且 A[i] > A[j],则 <A[i], A[j]>
这个有序对称为 A
的一个逆序,又称作一个逆序对。
2、逆序数。整个序列中的逆序对的个数叫做序列的逆序数。
3、逆序列。逆序列是表示序列逆序属性的一个序列,其定义是这样的,逆序列中的某一项aj表示原序列中的第二成分(左边成分)为j的逆序对的个数。逆序列中的j需要从小到大正序排列,这样子组成的序列就叫作逆序列。显然,逆序列各项之和也是序列的逆序数。
排序方法:
首先,根据待排序列,写出其逆序列。
然后,根据逆序列中的每一项所代表的数j和逆序个数aj,将待排序列中对应的数j向左邻交换aj次。
那么,交换完成后,序列就排序完成。此时,交换的次数就是最少的次数,也是原序列的逆序数。
原序列: 4 8 2 7 5 6 1 3
逆序对有:
(4,2), (4,1), (4, 3),
(8,2), (8,7), (8,5), (8,6), (8,1), (8,3),
(2,1),
(7,5), (7,6), (7,1), (7,3),
(5,1), (5,3),
(6,1), (6,3),
逆序数为18
逆序列为:6 2 5 0 2 2 1 0
*/
int main()
{
int num,i;
int arr[10001];
while(cin>>num)
{
int count =
0;
for( i=0;i<num;i++)
cin>>arr[i];
for(i=0;i<num-1;i++)
for(int j=i+1;j<num;j++)
if(arr[i]>arr[j])
count++;
cout<<"Minimum exchange operations : "<<count<<endl;
//由题意直接求出逆序对个数即可
}
}
相关文章推荐
- 7-6 冒泡法排序(20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素
- HDU - 2689 Sort it与2016蓝桥杯B 交换瓶子 排序(相邻交换与任意交换)
- UVA 11729 - Commando War(贪心 相邻交换法)
- uva 11269 - Setting Problems(相邻交换法)
- (使用STL自带的排序函数进行编程7.3.14)UVA 10062 Tell me the frequencies!(求一个字符出现的次数(包括字母和数字)&&按出现的次数降序)
- 【留坑】UVA10810 求逆序对==求最少相邻元素交换次数 归并排序OR线段树OR树状数组
- UVA110模拟出Pascal的8个数字的排序代码插入式递归
- (使用STL自带的排序功能进行排序)UVA 10905 Children's Game(求一组数据所能拼出的最大数字串)
- UVA 10474-Where is the Marble?(排序查找在数字在新序列中的位置)
- uva 331 Mapping the Swaps 求交换排序的map 纯DFS
- 2299-Ultra-QuickSort-交换相邻两个数排序-求逆序对个数-合并排序
- uva 331 Mapping the Swaps 求交换排序的map 纯DFS
- 交换相邻数字,使pi ≠ i
- 给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)
- uva 331 Mapping the Swaps 求交换排序的map 纯DFS
- PAT 1067. Sort with Swap(0,*) (25)(交换同一个数字给数列排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 两个数组 [n] [m] n>m 第一个数组的数字无序排列 第二个数组为空 取出第一个数组的最小值 放到第二个数组中第一个位置, 依次类推. 不能改变A数组,不能对之进行排序,也不可以倒到别的数组中。
- UVA 10361 串位置的交换
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现