まず例を見てみましょう。
ソートされた配列があります。数値の入力を要求した後、元のソート規則に従ってその数値が配列に挿入されます。
アイデア分析
1) この配列は順序付き配列です。質問では昇順と降順については言及されていませんが、この順序付き配列は昇順 (数値が小さいものから大きいものへソートされている) であると仮定します。
2) 挿入する数値が配列内のどの数値よりも小さい場合は、その数値を配列の最初の位置に置き、配列内の残りの数値を後方に移動して新しい配列を形成します。挿入された数値が次の値より小さい場合、配列内の数値が大きすぎる場合は、その数値を配列の最後の桁の次の位置に置き、配列内の数値の位置は変更されずに新しい配列を形成します。 insert は配列に挿入されます。最初の数値を見つけます。それより大きい数値の場合は、それより大きい最初の数値の位置と、それより大きい最初の数値の位置および最初の数値の後の数値の位置に入れます。それより大きい数値は 1 ビット後方に移動されて、新しい配列が形成されます。
例えば:
順序付き配列 arr[6]={11,22,33,44,55} に 38 を挿入します。観察を通じて、新しい順序付き配列を形成するには 44 の前に 38 を挿入する必要があると直接結論付けることができますが、コンピューターはわかりませんが、彼は配列をループして 38 より大きい最初の数値 44 を見つけるだけで、次に 44 の位置に 38 を置き、次に 44 と 44 の後の数値を後方に移動して新しい配列を形成します。
コードを記述する例として、順序付けされた配列 arr[6]={11,22,33,44,55} に 38、0、および 60 を挿入します。
ケースコードは次のとおりです
#include <stdio.h>
#define N 6
void main(){
int arr[N]={11,22,33,44,55};
int a;
int i,j=0;
printf("请输入要插入的数\n");
scanf("%d",&a);
for(i=0;i<N;i++){
if(arr[i]>a){
j=i;//j记录第一个比插入数字大的数字位置
break;//如果插入的数要放在数组第一个位置上,j为0;
//如果插入的数要放在数组里面,j<N;
}
else{
j+=1;//如果插入的数要放在数组最后一个数字的后面,j为N;
}
}
if(j==0){//如果插入的数字小于数组的所有数字,就把他放在数组的第一个位置上,j是0
for(i=N;i>=j;i--){
arr[i+1]=arr[i];//把数组里大于插入数字的数字都向后移动一个位置
}
arr[j]=a;//插入的数字要放的位置,下面代码块的arr[j]=a;同理
}
else if(j<N){//如果插入的数字要插在数组里,j<n
for(i=N;i>=j;i--){
arr[i+1]=arr[i];//把数组里大于插入数字的数字都向后移动一个位置
}
arr[j]=a;
}
else if(j==N){//如果插入的数要放在数组最后一个数字的后面,j为N;
arr[N-1]=a;数组最后一个数字后面的位置下角标为N-1
}
printf("新的有序数组如下\n");
for(i=0;i<N;i++){
printf("%d\t",arr[i]);
}//打印输出插入数字的有序数组,
}
ケースコードは次のとおりです
38 配列に挿入する
配列に0が挿入される
60 が配列に挿入されました