1. 程式人生 > >資料結構實驗之排序二:交換排序__快排、冒泡、選擇

資料結構實驗之排序二:交換排序__快排、冒泡、選擇

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


注意:資料相等時不做交換

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
int a[100001],a1[100001],a2[100001],num;
void Sort(int a[],int l,int r)// 快排 O(n log n)
{
    int x=a[l],i=l,j=r;
    if(i>=j) return;
    while(i<j)
    {
        while(i<j&&a[j]>=x) j--;
        if(a[i]!=a[j]) num++;
        a[i]=a[j];
        while(i<j&&a[i]<=x) i++;
        if(a[i]!=a[j]) num++;
        a[j]=a[i];
    }
    a[i]=x;
    Sort(a,l,i-1);
    Sort(a,i+1,r);
}
int Sort1(int a[],int n)// 冒泡 O(n^2)
{
    int num=0;
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-1-i; j++)
        {
            if(a[j]>a[j+1])
            {
                swap(a[j],a[j+1]);
                num++;
            }
        }
    }
    return num;
}
/*int Sort2(int a[],int n)// 選擇 O(n^2)--->小於冒泡
{
    int num=0;
    for(int i=0; i<n-1; i++)
    {
        for(int j=i+1; j<n; j++)
        {
            if(a[i]>a[j])
            {
                swap(a[i],a[j]);
                num++;
            }
        }
    }
    return num;
}*/
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
            a1[i]=a[i];
            a2[i]=a[i];
        }
        num=0;
        Sort(a,0,n-1);
        int num1=Sort1(a1,n);
        //int num2=Sort2(a2,n);
        cout<<num1<<" "<<num<<endl;
    }
    return 0;
}

————
餘生還請多多指教!