zoukankan      html  css  js  c++  java
  • 「SP25784」BUBBLESORT

    SP25784 BUBBLESORT - Bubble Sort

    题目描述

    One of the simplest sorting algorithms, the Bubble Sort, can be expressed as (0-based array):

    procedure bubbleSort( A : list of sortable items )
    
    n = length(A)
    
    repeat
    
    swapped = false
    
    for i = 1 to n-1 inclusive do
    
    /* if this pair is out of order */
    
    if A[i-1] > A[i] then
    
    /* swap them and remember something changed */
    
    swap( A[i-1], A[i] )
    
    swapped = true
    
    end if
    
    end for
    
    until not swapped
    
    end procedure
    

    Now, given an array of N integers, you have to find out how many swap opeartions occur if the Bubble Sort algorithm is used to sort the array.

    输入输出格式

    输入格式:

    Input begins with a line containing an integer T(1<=T<=100), denoting the number of test cases. Then T test cases follow. Each test case begins with a line containing an integer N(1<=N<=10000), denoting the number of integers in the array, followed by a line containing N space separated 32-bit integers.

    输出格式:

    For each test case, output a single line in the format Case X: Y, where X denotes the test case number and Y denotes the number of swap operations needed modulo 10000007.

    输入输出样例

    输入样例#1:

    1
    4
    3 2 1 4
    

    输出样例#1:

    Case 1: 3
    

    思路

    运用归并排序,求出逆序对即可。具体看代码注释。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define mod 10000007
    #define MAXN 10005
    
    int T, N, ans;
    int a[MAXN], b[MAXN];
    
    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 );//右边排序
    	int i1(l), i2(mid + 1), c(l);//把左右两边归并
    	while( i1 <= mid && i2 <= r ){
    		if ( a[i1] <= a[i2] ) b[c++] = a[i1++];//必须写<=
    		else b[c++] = a[i2++], ans = ( ans + mid - i1 + 1 ) % mod;//顺便统计逆序对个数(右边元素之前有mid-i1+1个比它大的)
    	}
    	while( i1 <= mid ) b[c++] = a[i1++];//剩余的元素排到后面
    	while( i2 <= r ) b[c++] = a[i2++];
    	for ( int i = l; i <= r; ++i ) a[i] = b[i], b[i] = 0;//复制回原数组
    }
    
    int main(){
    	scanf( "%d", &T );
    	for ( int Ti = 1; Ti <= T; ++Ti ){
    		scanf( "%d", &N );
    		for ( int i = 1; i <= N; ++i ) scanf( "%d", &a[i] );
    		ans = 0;//初始化很重要
    		Merge_sort( 1, N );
    		printf( "Case %d: %d
    ", Ti, ans );
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    iOS开发UI—Button基础
    iOS开发UI—UIWindow介绍
    第43月第27天 nginx keeplike高可用
    第43月第23天 商品秒杀 乐观锁
    第43月第22天 github 工程 svn checkout ipa瘦身
    第43月第21天 h264文件格式
    第43月第17天 iOS 子线程开启、关闭runloop performSelector
    第43月第15天 nginx负载均衡 redis
    第43月第11天 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange转rgb
    第43月第10天 uiimage写文件
  • 原文地址:https://www.cnblogs.com/louhancheng/p/10271312.html
Copyright © 2011-2022 走看看