关于逆序数的程序 大神来帮我改改吧 错误太多我实在是改不完了
倒是没有语法上的错误 只是运行起来结果不对
有关于逆序数 1234的逆序数=0 1324逆序数=1 反正就是后一位的数和前面的比较
2 4 3 1 5 4之前有0个 3之前有1个 1之前有3个 5之前有0个所以逆序数就是1+3=4
然后我的程序是要输入十个数 然后输出他们各自的逆序数
下面是一直改不好的程序
#include<stdio.h>
#define N 10
int main()
{
int a[N],c,*p,e,i,f,d[N][4],j,h;
c=0;f=0;
p=&a[0]; //p=a一样
printf("请定义十个数(每个数的值限制在10000以内):");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<=9;i++) //整体的十个数进入总循环体
{
c=*p/10;
if(c=1)
{j=1;
printf("\na=%d,逆序数=0",*p);}
else
{
for(j=1;c!=0;j++)
{c/=10; //确定位数
f=*p%10;
d[i][j]=f;} //第几个数的第几位是多少用二维数组储存
for(j=0;j<4;j++)
if(d[i][j]>d[i][j+1])
h=h;
else
h++;
printf("\na=%d,逆序数=%d",*p,h);
*p++;}
}
return(0);
}
// o(nlogn) 逆序数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int Calc(int* a, int* b, int first, int last) {
if(first >= last) return 0; // 一个元素的情况下没有逆序数
int i,j,k=0,mid,res=0;
k=i=first;
mid=(first+last)/2;
j=mid+1;
res=Calc(a,b,i,mid)+Calc(a,b,j,last); // 递归计算两边的逆序数
// 计算两边相关联的数据的逆序数
while((i<=mid) && (j<=last)) {
if(a[i]<a[j]) b[k++]=a[i++],res+=j-mid-1;
else b[k++]=a[j++]; // 是不是没有考虑a[i]=a[j]的问题
}
while(i<=mid) b[k++]=a[i++],res+=j-mid-1;
while(j<=last) b[k++]=a[j++];
// memcpy(a+first,b+first,sizeof(int)*(first-last+1));
for(i=first; i<=last;++i)
a[i]=b[i];
return res;
}
int main() {
int n;
scanf("%d",&n);
int* a=(int*) calloc(n, sizeof(int));
int* b=(int*) calloc(n, sizeof(int));
int i=0;
for(i=0;i<n;++i) {
scanf("%d",(a+i));
}
printf("%d/n",Calc(a,b,0,n-1));
// system("pause");
return 0;
}

#include<stdio.h>
#define N 10
//求逆序數
int get_inversion(int *arr, int size)
{
int sum = 0;
for(int i = 0; i < size; ++i)
{
for(int j = i+1; j < size; ++j)
{
if(arr[i] > arr[j])
{
++sum;
}
}
}
return sum;
}
int main()
{
int a[N],c,*p,e,i,f,d[N][4],j,h;
c=0;f=0;
p=&a[0]; //p=a一样
printf("请定义十个数(每个数的值限制在10000以内):");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("序列: ");
for(i=0;i<N;i++)
printf("%d, ",a[i]);
printf("逆序数=%d\n", get_inversion(a, N));
return 0;
}