1. 程式人生 > >SDUT-3399_數據結構實驗之排序二:交換排序

SDUT-3399_數據結構實驗之排序二:交換排序

原來 覆蓋 空格 mem tdi 多余 () 題解 out

數據結構實驗之排序二:交換排序

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

冒泡排序和快速排序都是基於"交換"進行的排序方法,你的任務是對題目給定的N個(長整型範圍內的)整數從小到大排序,輸出用冒泡和快排對這N個數排序分別需要進行的數據交換次數。

Input

連續多組輸入數據,每組數據第一行給出正整數N(N ≤ 10^5),隨後給出N個整數,數字間以空格分隔。

Output

輸出數據占一行,代表冒泡排序和快速排序進行排序分別需要的交換次數,數字間以1個空格分隔,行末不得有多余空格。

Sample Input

8
49 38 65 97 76 13 27 49

Sample Output

15 9

Hint

註意:數據相等時不做交換

題解:在原來的排序函數上稍微改造就可以了,註意需要兩個數組存儲原數據,因為第一個函數對數組進行排序後,當前數組已經有序,會影響另外一個排序的統計,所以兩個排序函數各用一個數組。
關於快排的統計,原本以為最後一個(a[i]=x)需要記錄的,結果WA了,後來反應過來,快排交換過程是覆蓋式的,(a[i]=x)是完成了整個交換過程,不用計數。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[112345],b[112345],n,p,q;

void sort(int l,int r)
{
    if(l>=r)
        return;
    int i = l,j = r;
    int x = a[l];
    while(i<j)
    {
        while(i<j&&a[j]>=x) j--;
        if(a[i]!=a[j])
        {
            a[i] = a[j];
            p++;
        }
        while(i<j&&a[i]<=x) i++;
        if(a[i]!=a[j])
        {
            a[j] = a[i];
            p++;
        }
    }
    a[i] = x;
    sort(l,i-1);
    sort(i+1,r);
}

void f(int a[])
{
    int i,j,t;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
            if(a[j]>a[j+1])
            {
                q++;
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
}

int main()
{
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            b[i] = a[i];
        }
        q = p = 0;
        sort(0,n-1);
        f(b);
        printf("%d %d\n",q,p);
    }
    return 0;
}

SDUT-3399_數據結構實驗之排序二:交換排序