有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。(c语言)

文章讲述了在尝试使用冒泡排序法对数组进行排序时遇到的问题,即无法正确重排已输入的数。作者发现需要采用迭代法,即类似打擂台的方式,逐个将新插入的数与原数组中的数比较并交换位置,确保数组在每次插入后保持升序。在老师的指导下,作者了解到排序时数组长度应固定,而非在插入时排序。最终提供的C语言代码展示了如何实现这个方法。

遇到的问题

  1. 我尝试使用冒泡排序法,在输入数后将原本的数组重新排序可是无论如何都无法做到重新排序

  1. 在循环阶段的冒泡排序,到了要交换数值的地方突然将数全部变为原本的数

解决方法

  1. 冒泡排序没有办法解决这个问题则需要换思路,通过对csdn上面大佬的代码,我发现需要使用迭代法(类似,或者称打擂台法)。具体的算法思路为:将插入的数和原数组的数进行一一比较(原数组为升序),当插入数比原数组大时,对原数组的数和插入数进行交换,当比较发现插入数为最大时将数组最后的数设置为插入数。

  1. 这个问题现在的我没办法解答,询问老师过后,老师的解答为,在排序时数组的长度应是固定的才开始排序,而不是在插入时排序。

最终代码(参考大佬)

在已排好的C语言数组中按原排序规律插入一个输入,可依据插入数数组元素的大小关系,将其插入合适位置。以下是几种实现方法: ### 方法一 此方法先判断插入数是否大于数组最后一个,若大于则放于数组末尾;若不大于,则逐个比较找到插入位置,再将后续元素后移。 ```c #include<stdio.h> int main() { int a[11]={1,2,6,9,11,13,19,28,33,99}; int temp1,temp2,num,end,i,j; printf("array a:\n"); for(i=0;i<10;i++) { printf("%5d",a[i]); } printf("\n"); printf("insert data:"); scanf("%d",&num); end=a[9]; if(num>a[9]) { a[10]=num; } else { for(i=0;i<10;i++) { if(a[i]>num) { temp1=a[i]; a[i]=num; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } printf("New array a:\n"); for(i=0;i<11;i++) { printf("%5d",a[i]); } printf("\n"); return 0; } ``` ### 方法二 同样先判断插入数数组最后一个的大小,插入数大则放末尾;不大则找插入位置并后移后续元素。 ```c #include<stdio.h> int main() { int arr[11] = { 1,2,13,24,35,46,57,68,79,100 }; for (int i = 0;i < 10;i++) printf("%d ", arr[i]); printf("\n"); int num,tep1=0,tep2=0; printf("请输入一个:\n"); scanf("%d", &num); if (num >= arr[9]) { arr[10] = num; } else { for (int i = 0;i < 10;i++) { if (arr[i] >= num) { tep1 = arr[i]; arr[i] = num; for (int j = i + 1;j < 11;j++) { tep2 = arr[j]; arr[j] = tep1; tep1 = tep2; } break; } } } printf("插入后的列:\n"); for (int i = 0;i < 11;i++) printf("%d ", arr[i]); printf("\n\n\n"); } ``` ### 方法三 从后往前查找插入位置,将大于插入数的元素后移,再把插入数放到合适位置。 ```c int main() { int c=0; int a[10] = {0, 1,2,3,4,6,7,8,9 }; int end = 8; int i; scanf("%d", &c); for (i = 0; i < 9; i++) printf("%d", a[i]); printf("\n"); while (end >= 0 && c < a[end]) { a[end + 1] = a[end]; end--; } a[end + 1] = c; for (i = 0; i < 10; i++) printf("%d", a[i]); printf("\n"); return 0; } ``` ### 方法四 通过比较插入数数组元素,若插入数小则交换,若大于最后一个则放于末尾。 ```c #include <stdio.h> int main() { int a[11]={1,2,3,4,5,7,8,9,10,11}; int i,t,m; printf("输入一个:\n"); scanf("%d",&m); for(i=0;i<11;i++) { if(m<a[i]) { t=m;m=a[i];a[i]=t; } else if(m>a[9]) a[10]=m; } printf("排序后:\n"); for(i=0;i<11;i++) printf("%d ",a[i]); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值