SDUT-3399_數據結構實驗之排序二:交換排序
阿新 • • 發佈:2018-12-20
原來 覆蓋 空格 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_數據結構實驗之排序二:交換排序