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