zoukankan      html  css  js  c++  java
  • Program A-归并排序

    Description

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
    9 1 0 5 4 ,

    Ultra-QuickSort produces the output
    0 1 4 5 9 .

    Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

    Input

    The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

    Output

    For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

    Sample Input

    5
    9
    1
    0
    5
    4
    3
    1
    2
    3
    0
    

    Sample Output

    6
    0


    此题就是要求逆序数,所以用归本排序较好。




    #include<iostream>
    
    using namespace std;
    
    long long  cnt;
    
    void merge(int array[],int left,int mid,int right)
    {
        int* temp=new int[right-left+1];
        int i,j,p;
        for(i=left,j=mid+1,p=0;i<=mid&&j<=right;p++)
        {
            if(array[i]<=array[j])temp[p]=array[i++];
            else
            {
                temp[p]=array[j++];cnt+=(mid-i+1);
            }
        }
        while(i<=mid)temp[p++]=array[i++];
        while(j<=right)temp[p++]=array[j++];
        for(i=left,p=0;i<=right;i++)array[i]=temp[p++];
        delete temp;
    }
    
    void mergesort(int array[],int left,int right)
    {
        if(left==right)array[left]=array[right];
        else
        {
            int mid=(left+right)/2;
            mergesort(array,left,mid);
            mergesort(array,mid+1,right);
            merge(array,left,mid,right);
        }
    }
    int main()
    {
        int n,array[500005];
        while(cin>>n,n)
        {
            cnt=0;
            for(int i=0;i<n;i++)
                cin>>array[i];
            mergesort(array,0,n-1);
                cout<<cnt<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    写一个函数的程序,判断是否是浮点数
    写一个函数,输入一个数,随机生成N条邮箱
    day4-python基础知识 <元组&&集合>
    day4-python基础知识<文件操作>
    程序--用户登录--<while循环>
    程序--<猜数字小游戏>--for
    使用ajax后提交事件后禁用按钮,事件执行完毕后,重新启用按钮
    ajax在弹出对话框中实现一个UpdateProgress进度条控件源代码
    运算符的结合性
    匿名方法
  • 原文地址:https://www.cnblogs.com/xl1164191281/p/4716253.html
Copyright © 2011-2022 走看看