資料結構實驗之排序二:交換排序__快排、冒泡、選擇
阿新 • • 發佈:2018-12-11
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; }
————
餘生還請多多指教!