Voici mon code pour trouver la position d'une valeur dans un tableau trié en utilisant une recherche binaire. Mon problème est que la valeur peut être présente dans mon tableau plus d'une fois, mais ma recherche montre seulement la position de la première correspondance trouvée. Je veux afficher la position de toutes les valeurs correspondantes. Comment puis-je trouver la position de toutes les valeurs dans mon tableau en utilisant la recherche binaire?Comment puis-je trouver toutes les valeurs correspondantes avec une recherche binaire?
#include<stdio.h>
#include<stdlib.h>
void aSort(int *a, int aLen){
int i, j;
for(i=0; i<aLen-1; i++){
for(j=i+1; j<aLen; j++){
if(a[i] > a[j]){
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
return;
}
void bSearch(int *a, int aSize, int key,int *rArr, int *ItemNum){
int start = 0;
int aEnd = aSize-1;
int mid = (start + aEnd)/2;
*ItemNum = -1;
while(start<=aEnd){
if(key == a[mid]){
*ItemNum += 1;
rArr[*ItemNum] = mid;
break;
}else if(a[mid] < key){
start = mid + 1;
}else{
aEnd = mid - 1;
}
mid = (start + aEnd)/2;
}
return;
}
int main(){
int n;
char i_type;
printf("Enter number of array element: \n");
scanf("%d", &n);
int a[n];
printf("Insert array element manual or automatic?\nIf manual press 'M' or press 'A' for automatic\n");
scanf("%*c%c", &i_type);
if(i_type == 'a' || i_type == 'A'){
printf("The array elements is:\n");
int i;
for(i=0; i<n; i++){
a[i] = rand()%100;
printf("%d ", a[i]);
}
}else{
printf("Enter %d integer value: ", n);
int i;
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
printf("The array elements is:\n");
for(i=0; i<n; i++){
printf("%d ", a[i]);
}
}
aSort(a, n);
printf("\nNow the array is in ascending order:\n");
int i;
for(i=0; i<n; i++){
printf("%d ", a[i]);
}
printf("\nEnter the key value which you want to find: ");
int key, numArr, rArr[n];
scanf("%d", &key);
bSearch(a, n, key, rArr, &numArr);
if(numArr == -1){
printf("Item not found!\n");
}else{
int i;
for(i=0; i<=numArr; i++)
printf("Your item found in %d position.\n", rArr[i]+1);
}
return 0;
}
Après avoir trouvé la première position de l'élément, vous pouvez remplacer cet index par un grand nombre et trier à nouveau et effectuer une recherche binaire. Répétez jusqu'à ce que la recherche binaire ne puisse pas trouver la valeur. Ce n'est pas une solution optimale, mais cela fonctionne. Ou une solution optimale vérifie les positions adjacentes après la recherche binaire. –
Indice: les autres valeurs sont nécessairement à côté de celle que vous avez trouvée via la recherche binaire. Donc, une fois que vous avez trouvé une valeur, il devrait être facile de trouver les autres. –
Votre 'numArr' n'est pas initialisé correctement, il ne pointe pas vers un bloc de mémoire qui pourrait contenir plusieurs ints. En outre, vous devez supprimer le 'break' dans la condition correspondante et mettre une boucle' while' dedans pour continuer à vérifier les éléments adjacents, en poussant leurs index, s'ils correspondent, à votre tableau 'ItemNum'; Lorsque les éléments adjacents ne correspondent plus, vous devriez "casser". Si votre tableau correspondant contient des éléments supplémentaires pour stocker les index correspondants, vous devez placer une valeur sentinelle dans l'élément adjacent au dernier élément correspondant. – Rafael