❶ c语言数组问题:输入一组整数,将其顺序颠倒后输出
看了一下 上面的6个回答是不是跟要求不符阿
上面的回答只是“输入一组整数,将其顺序颠倒输出”
而要求是“将其顺序颠倒后输出”注意“后”
我写一个参考一下吧:
#include <stdio.h>
int main(void)
{
int Num;
int i ;
int j ;
int a_To_b;
int a[100];
printf("How many integers do you want to erter (Num < 100):\n");
scanf("%d",&Num);
if(Num >=100)
{
printf("It is a bad number !\n");
return 1;
}
printf("\n");
printf("Please erter :\n");
for(i=0;i<Num;i++)
{
printf("Enter the value of a[%d] ",i);
scanf("%d",&a[i]);
}
printf("\n");
printf("Now begin to reverse the a[%d]: \n",Num);
for(i=0,j=Num-1; i<(Num/2); i++,j--)
{
a_To_b = a[i];
a[i] = a[j];
a[j] = a_To_b;
}
printf("reversal is finished:\n");
printf("\n");
printf("Now output the a[%d]:\n",Num);
for(i=0;i<Num;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
return 0;
}
❷ C语言:将数组中的元素颠倒次序存放(程序改错)
#define N 6
#include <stdio.h>
void main()
{
int temp,i;
int a[N] = {2,4,1,6,8,5};
for(i = 0; i < N; i ++)
printf("%4d", a[i]);
for(i = 0; i <N/2; i ++)//这里 把循环条件改成i<N/2 不然又换回去了 白干
。。。。下面的可以不用动了
}
❸ c语言怎么将数组中得元素按照反顺序存放啊!各位大神帮帮忙啊😊
#include<stdio.h>
intmain(void)
{
inta[10]={1,2,3,4,5,6,7,8,9,0},b[10],i;
for(i=0;i<10;i++)
b[i]=a[9-i];
for(i=0;i<10;i++)
{
printf("%d",b[i]);
if(i!=9)
printf(",");
}
printf(" ");
return0;
}
仅供参考。
❹ C语言,颠倒数组元素顺序
int rev_intary(int v[],int n)
{
int i;
printf("{");
for(i=0;i<n,i++)
{
printf("%d, ",v[n-i-1]);
}
printf("}");
}
上面这段程序只是把它倒过来打印出来,毕竟我看你也没说要返回一个倒过来的数组返回
❺ 求改错,C语言,按相反顺序输出数组元素
for(p=a;p<a+10;p++)
printf("%d\n",*p++);//为什么这里只输出了24680
这个for循环中,每次循环过程中p都自增了两次,因此输出02468把第一个p++删除即可。 for(i=1;p<=p+(n-1)/2;p++,i++)
{
tmer=*p;
*p=*(p+(n-i));
*(p+(n-i))=*p;
}
中 *(p+(n-i))=*p; 改为 *(p+(n-i))=tmer;
❻ C语言颠倒排序
(1)“冒泡法” 冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ { int i,j,temp; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) /*注意循环的上下限*/ if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } 冒泡法原理简单,但其缺点是交换次数多,效率低。 下面介绍一种源自冒泡法但更有效率的方法“选择法”。 (2)“选择法” 选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。void choise(int *a,int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; /*给记号赋值*/ for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/ if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ temp=a[i]; a[i]=a[k]; a[k]=temp; } } } 选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 (3)“快速法” 快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i+j)/2]; /*选取的参照*/ do { while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/ while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/ if(m<=n) { /*若找到且满足条件,则交换*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } }while(m<=n); if(m<j) quick(a,m,j); /*运用递归*/ if(n>i) quick(a,i,n); } (4)“插入法” 插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。void insert(int *a,int n) { int i,j,temp; for(i=1;i<n;i++) { temp=a[i]; /*temp为要插入的元素*/ j=i-1; while(j>=0&&temp<a[j]) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/ a[j+1]=a[j]; j--; } a[j+1]=temp; /*插入*/ } } (5)“shell法” shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:void shell(int *a,int n) { int i,j,k,x; k=n/2; /*间距值*/ while(k>=1) { for(i=k;i<n;i++) { x=a[i]; j=i-k; while(j>=0&&x<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=x; } k/=2; /*缩小间距值*/ } } 上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。 #include<stdio.h> /*别偷懒,下面的"..."代表函数体,自己加上去哦!*/ void bubble(int *a,int n) { ... } void choise(int *a,int n) { ... } void quick(int *a,int i,int j) { ... } void insert(int *a,int n) { ... } void shell(int *a,int n) { ... } /*为了打印方便,我们写一个print吧。*/[code]void print(int *a,int n) { int i; for(i=0;i<n;i++) printf("%5d",a[i]); printf("\n"); } main() { /*为了公平,我们给每个函数定义一个相同数组*/ int a1[]={13,0,5,8,1,7,21,50,9,2}; int a2[]={13,0,5,8,1,7,21,50,9,2}; int a3[]={13,0,5,8,1,7,21,50,9,2}; int a4[]={13,0,5,8,1,7,21,50,9,2}; int a5[]={13,0,5,8,1,7,21,50,9,2}; printf("the original list:"); print(a1,10); printf("according to bubble:"); bubble(a1,10); print(a1,10); printf("according to choise:"); choise(a2,10); print(a2,10); printf("according to quick:"); quick(a3,0,9); print(a3,10); printf("according to insert:"); insert(a4,10); print(a4,10); printf("according to shell:"); shell(a5,10); print(a5,10); }
声明:本答案来自网络网友“ 胡子萧” 由于本人知识有限只对冒泡法进行了校核。不足之处还请见谅!!!!
❼ 用C语言对数组内元素乱序排列并输出
方法1:比较笨的办法是先排好。再在里面找。看是原来的第几个。 (代码我就不写了。)
方法2:有一个很快的方法,就是用快速排序排,
如果你深入的了解了快排,那么这个就很简单了。而且效率很高。
我给你写代码。
❽ 编写c语言程序实现将一个长度为n的一维数组中的元素按颠倒的顺序重新存放并输出颠倒后的数组元素
其实逆序啊,就是将数组的顺数第n个和倒数第n个交换,直到n<数组长度的一半.
eg:假设是int类型的数组:
void
chen(int
&a,int
len)
{
int
tmp
=
0;
for(int
i=0;i<len/2;i++)
{
tmp
=
a[i];
a[i]
=
a[n-i]
;
a[n-i]
= tmp;
}
}
//至于chen()中是使用*还是&,你可以再查查这两个符号的区别!
❾ C语言程序,将数组a中10个元素按相反顺序输出,运行结果有问题
printf("%d",a[i])
不要&号
❿ C语言数组元素逆序排列怎么做
首先阐述一下逆序对的概念。假设有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。
那么统计一个数组中的逆序对,有什么作用呢。逆序对可以反映插入排序的效率问题,如果逆序对数量多,那么插入排序的效率就低,反之亦然。
那么如何快速的找到逆序对的数量,同时又能够对数组进行排序,并且使得复杂度为O(n*logn)呢?这就可能是一个小问题
看到复杂度为n*logn 有一种亲切感,应为我们可以知道归并排序的时间复杂度为O(n*logn)。 同时归并排序是通过递归的方法建立递归树,利用最小的两个元素进行对比然后逐层向上进行递归,然后对比两个已经排好序的数组,得到最终完整的排好序的数组。
归并排序分为了3步骤;
第一步 拆分
第二步进行 计算两个同样类型但是规模较小的数组
第三步 合并两个已排好序的数组
因此从整个数组拆分过程中,我们将它不断进行拆分,而拆分得到的两个数组,又是和原数组目的和形式相同的(即都是要排序,同时如果不为最小还要进行以上3步)
这样可以想到递归解决问题,每一层进行相同的3步,知道不能进行位置。那么这个不能进行的判断显得格外重要。
那么加入了逆序对后,如何考虑呢,实际上很简单。以为从最下面的含两个元素的数组,到上层含多个元素的数组都有前后之分,这正好与逆序对性质相符,只要我
们找出前面那一个数组中假设L[i] 大于 后面一个数组中某个元素R[j]
然后就知道前面那个数组在该元素L[i]之后的元素都应该是大于R[j]的。因为在归并过程我们也进行了排序。
大概思路就是这样,以下是代码。
[cpp] view plain
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define Infinite_num 1000
int L[100];
int R[100];
int merge_sort(int Array[],int p,int q,int r)
{
int n1 = q-p+1;
int n2 = r-q;
for(int i=0;i<n1;i++)
{
L[i] = Array[p+i];
}
L[n1] = Infinite_num;
for(i=0;i<n2;i++)
{
R[i] = Array[q+i+1];
}
R[n2] = Infinite_num;
int inversions = 0;
int count = false;
int j=0;
i=0;
for(int k=p;k<=r;k++)
{
if(count==false &&(L[i]>R[j])&&(R[i]!=Infinite_num))
{
inversions = inversions+n1-i;
count = true;
}
if(L[i]<=R[j])
{
Array[k] = L[i];
i++;
}
else
{
Array[k] = R[j];
j++;
count = false;
}
}
return inversions;
}
int merge_inverse(int Array[],int p,int r)
{
int inversions = 0;
int q = -1;
if(p < r)
{
q = (p+r)/2;
inversions = inversions+merge_inverse(Array,p,q);
inversions = inversions+merge_inverse(Array,q+1,r);
inversions = inversions+merge_sort(Array,p,q,r);
}
return inversions;
}
int main(int argc, char* argv[])
{
int Array[] = {1,3,7,8,2,4,6,5};
int inverse_times = 0;
inverse_times = merge_inverse(Array,0,7);
printf("%d",inverse_times);
return 0;
}