您的位置:首页 > 其它

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; 
//由题意直接求出逆序对个数即可

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐