数据结构实验之排序二:交换排序
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。
Input
连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。
Output
输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。
Example Input
8 49 38 65 97 76 13 27 49
Example Output
15 9 #include<stdio.h> #define N 100007 int num1, num2; int pai(int *a, int left, int right) { int key = a[left]; while(left < right) { while(left < right && a[right] >= key)right--; if(a[left] != a[right])num1++;a[left] = a[right]; while(left < right && a[left] <= key)left++; if(a[left] != a[right])num1++;a[right] = a[left]; } a[left] = key; return left; } void sort(int *a, int low, int high) { if(low < high) { int m = pai(a, low, high); sort(a, low, m - 1); sort(a, m + 1, high); } } void swap(int*a, int *b) { int t = *a; *a = *b; *b = t; } void maopao(int *a, int n) { int i, j; for(i = 0; i <= n - 2; i++) { for(j = 0; j <= n - 2 - i; j++) { if(a[j] > a[j + 1]) { swap(a + j, a + j + 1); num2++; } } } } int main() { int n, i, a[N], b[N]; while(~scanf("%d", &n)) { num1 = num2 = 0; for(i = 0; i <= n - 1; i++) { scanf("%d", &a[i]); b[i] = a[i]; } maopao(a, n); sort(b, 0, n - 1); printf("%d %d\n", num2, num1); } return 0; }