做了半天,很纠结的~~~
											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;
}