C语言编程题目 对已知整数数组a[]的元素按从小到大的顺序连续编号(即,值相同的元素有相同编号),

2024-12-29 15:07:46
推荐回答(1个)
回答1:

//思路:用指针数组进行排序,保存排序后的下标到c中。即a[c[0:N-1]]是升序的
//      然后依次比较c[i]为下标的有序数组a[c[0:N-1]]的各元素,进行顺序编号
/*
对已知整数数组a[]的元素按从小到大的顺序连续编号(即:值相同的元素有相同编号), 
并将编号保存在数组b[]中. 即, a[i]的编号为b[i]. 要求:
  1)用指针数组实现;
  2)数组a的元素随机生成(值<10)。
*/


#include
#include
#include
#define  N  10
void printIntArr(int a[], int n);//打印整型跟数组a的前n个值
//交换两个int*型指针的值
void swap2intPointer(int **x, int **y){
    int *temp = *x;//*x是int *型指针
    *x = *y;
    *y = temp;
};
void swap2int(int *x, int *y){
    int temp = *x;
    *x = *y;
    *y = temp;
};
int main()
{
srand(time(NULL));
int i=0,j=0, k=0;
int a[N]={},b[N]={},c[N]={};;
int *p[N]={NULL};
int flag=1; //1表示有交换
//生成数组,并初始化指针数组
for(int i=0;i {
a[i]=rand()%10;
c[i]=i;
p[i]=a+i;
}
printf("原始数组为:\n");
printIntArr(a,N);
//对指针数组进行排序,使得指针数组对应中元素指向的数据依次上升
for(i=0;flag&&i {
flag=0;//默认没有交换。这样在排好序时可以结束排序算法。
for( j=0;j {
if(*p[j] >*p[j+1])
{
swap2intPointer(&p[j],&p[j+1]);
swap2int(c+j,c+j+1);
flag=1;
}
}
}
//printf("排序后:\n");
//for(i=0;i //{
// printf("%3d ",*p[i]);
//}
//puts("\n");


/*i=0,j=0;
printf("排序后的下标:\n");
for(i=0;i {
printf("%3d ",c[i]);
}
puts("\n");*/

//最后一步:进行记录
i=0;
j=1;
while(i {
while(i {
b[c[i]]=j;
i++;
}
b[c[i]]=j++;
i++;
}
if(a[c[N-2]]!=a[c[N-1]])
b[c[N-1]]=j;
//打印数组元素大小编号
printf("原来数组元素的大小编号:\n");
for(i=0;i {
printf("%3d ",b[i]);
}
puts("\n");
return 0;


}

//打印整型数组a的前元素
void printIntArr(int a[], int n)
{
    if(n<=0) return;
    for(int i=0;i        printf("%3d ", a[i]);
    putchar('\n');
    return;
}