C 练习实例39
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
实例
// Created by www.facesoho.com on 15/11/9.
// Copyright © 2015年 小鸟启蒙. All rights reserved.
//
#include<stdio.h>
int main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int temp1,temp2,number,end,i,j;
printf("原始数组是:\n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n插入一个新的数字: ");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)
{
temp1=a[i];
a[i]=number;
for(j=i+1;j<11;j++)
{
temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}
}
}
for(i=0;i<11;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
以上实例输出结果为:
原始数组是: 1 4 6 9 13 16 19 28 40 100 插入一个新的数字: 10 1 4 6 9 10 13 16 19 28 40 100

文人墨客
参考方法:
#include <stdlib.h> #include <time.h> #include <stdio.h> void rank(int *numArray, int arrayLen);//排序函数声明 void insert(int *numArray, int num, int arrayLen);//插入函数声明 int main() { srand((int)time(NULL)); int *numArray = NULL, i, *InsertNumArray = NULL, len, insertN, max, min; printf("输入数组元素个数:"); scanf("%d", &len); printf("数组元素取值范围:"); scanf("%d %d", &min, &max); //为原始数组分配适当空间 numArray = (int*)realloc(numArray, len*sizeof(int)); for (i = 0; i < len; ++i)//初始化随机数数组 numArray[i] = rand() % (max - min + 1) + min;//min-max之间随机数 rank(numArray, len);//将原始数组元素从小到大排序 printf("原始数组是:\n");//输出一遍原始数组 for (i = 0; i < len; ++i) printf("%-6d", numArray[i]); printf("\n要插入的元素个数:"); scanf("%d", &insertN); printf("输入要插入的%d个新数字:", insertN); InsertNumArray = (int*)realloc(InsertNumArray, insertN*sizeof(int));//分配适当空间给插入的数字组成的数组InsertNumArray numArray = (int*)realloc(numArray, (len + insertN)*sizeof(int));//重新增添insertN个int空间给numArray以存放新增元素 for (i = 0; i < insertN; ++i)//将新元素挨个插入原始数组 { scanf("%d", &InsertNumArray[i]);//输入第i个元素 insert(numArray, InsertNumArray[i], len + i);//调用函数insert插入第i个元素InsertNumArray[i],数组numArray总长度len+i随i变化 } printf("新数组是:\n");//输出新数组 for (i = 0; i < len + insertN; ++i) printf("%-6d", numArray[i]); printf("\n"); return 0; } void rank(int *numArray, int arrayLen)//排序函数,numArray为数组,arrayLen为数组长度 { int i, j; for (i = 0; i < arrayLen; ++i) for (j = i + 1; j < arrayLen; ++j) if (numArray[i] > numArray[j])//小的元素排在前面,大的元素换到后面 { numArray[i] += numArray[j]; numArray[j] = numArray[i] - numArray[j]; numArray[i] = numArray[i] - numArray[j]; } } void insert(int *numArray, int insertNum, int arrayLen)//插入操作函数,numArray为数组,insertNum为要插入的数,arrayLen为数组长度 { int i, j, *p1 = numArray, *p2 = numArray; p1 += arrayLen - 1;//指针置于最末尾元素 p2 += arrayLen;//末尾置于最末尾元素后一位 for (i = 0; i < arrayLen; ++i)//加上insertNum共arraylen + 1个数组元素,从小到大遍历前arrayLen个元素 { if (insertNum < numArray[i])//如果第i位上的数组元素大于insertNum,则该位及其以后的数全部 往后移动一位,腾出第i位用于存放num { for (j = 1; j <= (arrayLen - i); ++j)//用指针实现挨个移位操作,共需要移动strlen - i位(strlen是数组长度,i是首个大于insertNum的数组元素在数组numArray上的索引位i) *p2-- = *p1--; *p2 = insertNum;//最后p2指向第i位,将num插入第i位 break; } if (i == arrayLen - 1)//已循环到了最后一个元素但还没有找到插入位置,说明此时最大元素就是insertNum,直接将insertNum放到numArray数组最后 { *p2 = insertNum;//此时p2指向数组numArray最末位置 break; } } }执行输出结果为:
文人墨客
参考方法:
#include <stdio.h> int main(){ int a[11]={1,4,6,9,13,16,19,28,40,100}; int i,num; printf("原始数组:"); for(i=0;i<10;i++) printf("%4d ",a[i]); printf("\n输入一个数,插入原数组:"); scanf("%d",&num); if(a[0]<a[9]){ //原数组为升序排列 if(num>a[9]) a[10]=num; else{ for(i=9;i>=0;i--){ if(num<a[i]) a[i+1]=a[i]; else{ a[i+1]=num; break; } } if(i==0) //当num比a[0]还小时 a[0]=num; } } if(a[0]>a[9]){ //原数组为降序排列 if(num<a[9]) a[10]=num; else{ for(i=9;i>=0;i--){ if(num>a[i]) a[i+1]=a[i]; else{ a[i+1]=num; break; } } if(i==0) //当num比a[0]还大时 a[0]=num; } } for(i=0;i<11;i++) printf("%4d",a[i]); printf("\n"); return 0; }文人墨客
参考方法:
#include<stdio.h> #define N 100 void insert_sort(int a[],int *length,int x); int main(void) { int a[N] = {0},j = 0,x,n; printf("输入数组长度:\n"); scanf("%d",&n); printf("原始数组是:\n"); for(;j < n; j++) scanf("%d",&a[j]); printf("插入一个新的数字:"); scanf("%d",&x); insert_sort(a,&n,x); for(int i = 0;i < n; i++) printf("%4d",a[i]); return 0; } void insert_sort(int a[],int *length,int x) { int i = 0,j; while(x > a[i]) //找到待插入位置 i++; for(j = *length - 1; j >= i; j--) a[j + 1] = a[j]; a[j + 1] = x; (*length)++; }文人墨客
这样最简单了,一次循环全部搞定
C99:
#include <stdio.h> #include <stdbool.h> // C99 int main() { int a[11] = { 1,4,6,9,13,16,19,28,40,100 }; int c=0, temp=0; bool z = false; printf("插入一个新的数字: "); scanf("%d", &c); for (int b = 0; b < 10; b++) { if (!z && c > a[b] && c <= a[b + 1]) { z = true; } if (z) { temp = a[b + 1]; a[b + 1] = c; c = temp; } printf("%-3d,", a[b]); } printf("%-3d,", a[10]); return 0; }C89 没有定义布尔类型:
#include <stdio.h> int main() { int a[11] = { 1,4,6,9,13,16,19,28,40,100 }; int c=0, temp=0; typedef enum { true=1, false=0 }bool; bool z = false; printf("插入一个新的数字: "); scanf("%d", &c); for (int b = 0; b < 10; b++) { if (!z && c > a[b] && c <= a[b + 1]) { z = true; } if (z) { temp = a[b + 1]; a[b + 1] = c; c = temp; } printf("%-3d,", a[b]); } printf("%-3d,", a[10]); return 0; }文人墨客
结合上一个来练习,输入5个数字,先将其排序,然后输入一个数字,插入排列好的数组中
#include <stdio.h> #define N 5 int *sort(int a[],int n); int main() { int i,j,a[N+1]; printf("请输入5个数字:\n"); for(i=0;i<N;i++) { scanf("%d",&a[i]); } sort(a,N); printf("排序后:\n"); for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); printf("请输入想要插入的数字:"); scanf("%d",&j); a[N]=j; sort(a,N+1); printf("插入后排序:\n"); for(i=0;i<N+1;i++) { printf("%d ",a[i]); } printf("\n"); return 0; } int *sort(int a[],int n) { int i,j,min,t; for(i=0;i<n-1;i++) { min=i; for(j=i+1;j<n;j++) { if(a[min]>a[j]) { min=j; } } if(min!=i) { t=a[min]; a[min]=a[i]; a[i]=t; } } return a; }输出结果为:
文人墨客
参考方法:
#include<stdio.h> int main() { int opo[11]={1,4,6,9,13,16,19,28,40,100};//原始的数组,题目给的 int a,b,c,e; printf("这是原始的数组"); for(a=0;a<10;a++)printf("%d ",opo[a]); printf("\n输入一个数,插入原数组"); scanf("%d",&b); for(c=9;c>=0;c--){ //使用逆序的话,可以省掉很多过程,而且清晰 if(b<opo[c]) { opo[c+1]=opo[c]; } else { opo[c+1]=b;break; } if(c==0) opo[0]=b; //应为是逆序,如果b比第一个小的话写不进去,要特意弄个if }//哇,逆序超简洁,惊了 for(e=0;e<=10;e++) printf("%d ",opo[e]); }