C 如何通过二进制搜索获得所有匹配值?

C 如何通过二进制搜索获得所有匹配值?,c,C,下面是我使用二进制搜索查找排序数组中值的位置的代码。我的问题是,该值可能多次出现在数组中,但我的搜索只显示它找到的第一个匹配项的位置。我想输出所有匹配值的位置。我如何解决我的问题? 提前谢谢 #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++){

下面是我使用二进制搜索查找排序数组中值的位置的代码。我的问题是,该值可能多次出现在数组中,但我的搜索只显示它找到的第一个匹配项的位置。我想输出所有匹配值的位置。我如何解决我的问题? 提前谢谢

#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;
}
#包括
#包括
void aSort(int*a,int aLen){
int i,j;

对于(i=0;i如果可能有许多重复值:进行两次二进制搜索,以查找“键”运行的开始和结束位置值。不要在完全匹配时终止搜索,也不要跳过
mid
;在找到元素的第一个位置后使用
,您可以用一个大的数字替换该索引,然后再次排序并进行二进制搜索。重复此操作,直到二进制搜索无法找到值。这不是最佳解决方案,但有效。或者最佳解决方案是ch检查二进制搜索后的相邻位置。提示:其他值必须与通过二进制搜索找到的值相邻。因此,一旦找到一个值,就应该很容易找到其他值。您的
numArr
未正确初始化,它不会指向可容纳多个整数的内存块。此外,您应该移除匹配条件中的
中断
,并在那里放置
while
循环,继续检查相邻元素,如果它们匹配,将它们的索引推送到
ItemNum
数组;当相邻元素不再匹配时,应
中断
。如果匹配数组中的元素超过了存储所需的数量在匹配索引中,应该在与最后一个匹配元素相邻的元素中放置一个sentinel值。