做了半天,很纠结的~~~
1、使用“翻转”操作,将数据从小到大排列,要求输出翻转的次数(每次翻转只能从第一个数据开始,和紧跟后面的若干数据一起翻转)例输入5(表示有多少个数据)
1 2 3 4 5
输出 0
输入5
5 1 2 3 4
输出 2
输入 6
8 4 6 7 5 2
输出 7
#include <stdio.h> //翻转 a0 到ak void inv(int a[],int k) { int t,*i,*j; for(i=a,j=a+k;i<j;i++,j--) { t=*i;*i=*j;*j=t; } } //----------------- int main (void) { int i,j,a[100],n,count=0,k,ok; scanf("%d",&n); for(i=0;i<n;i++)scanf("%d",&a[i]); for(i=0;i<n;i++) { ok=1; //假设已经排好序了 k=0; //初始最大值的下标 for(j=1;j<n-i;j++) { if( ok && a[j-1]>a[j])ok=0; //检查是否未排好序 if(a[j]>a[k])k=j; //求最大值的下标 } if(ok)break; else { if(k!=0){ inv(a,k);count++; } // 未排好序且k!=0时: 翻转 a0 到ak, 使得最大值到a0 inv(a,n-1-i);count++;); // 翻转 a0 到an-1-i,使得最大值置于应有的位置,并统计翻转次数 } } printf("%d\n",count); return 0; }
#include<stdio.h> void flip(int a[], int s, int e) { // 翻转数组的第 s 至 e 元素 int tmp; for (; s < e; s++, e--) { tmp = a[s]; a[s] = a[e]; a[e] = tmp; } } void put_a(int a[], int l) { // 只是用来显示数组 int i; for (i = 0; i < l; i++) { printf("%d ", a[i]); } printf("\n"); } int main() { int i, j, k, c = 0, n, a[100]; scanf("%d", &n); for (i = 0; i < n; i++) { scanf(" %d", &a[i]); } for (i = 0; i < n; i++) { k = i; for (j = i + 1; j < n; j++) { if (a[j] < a[i]) { k = j; } } if (k > i) { flip(a, i, k); put_a(a, n); // 这里用来显示每次翻转后数字的顺序 c++; } } printf("%d\n", c); return 0; }