我的插入方法和binsearch方法有问题吗
Is there something wrong with my insert method and binsearch method?
我正在学习编程,有一个已经创建的程序void merge()
。我尝试添加二进制搜索方法和插入方法。程序应按升序输出数组A
和B
的组合元素的列表。A
的元素应该放在B
的元素上。输出错误。
这是我的输出:
3 16
Inserting 512 into b at -1
2 0
61 154 170 275 426 509 612 653 677 703 765 897 908 512 503 512
这是我的代码:
#include<iostream>
#include<cmath>
using namespace std;
int binsearch(int array[], int first, int last, int search_key)
{
int index;
if (first > last)
index = -1;
else
{
int mid = (first + last) / 2;
if (search_key == array[mid])
index = mid;
else
if (search_key < array[mid])
index = binsearch(array, first, mid - 1, search_key);
else
index = binsearch(array, mid + 1, last, search_key);
} // end if
return index;
}
void insert(int A[], int B[], int n, int m, int i){
int j = n - m - 1, k = n - 1;
while (i >= 0 && j >= 0){
if (A[i] > B[j]){
B[k--] = A[i--];
}
else {
B[k--] = B[j--];
}
}
if (j<0){
while (i >= 0){
B[k--] = A[i--];
}
}
}
void merge(int a[], int b[], int m, int n) {
int a_size = m;
int b_size = n;
while (n != 0 && m != 0) {
printf("%d %dn", m, n);
if (!(m > n)) {
int t = log(n / m);
int i = n + 1 - pow(2, t);
if (a[m - 1] < b[i - 1]) {
printf("Decreasing nn");
n = n - pow(2, t);
}
else {
int k = binsearch(b, i - 1, n, a[m - 1]) + 1;
printf("Inserting %d into b at %dn", a[m - 1], k - 1);
insert(a, b, b_size, k-3, m-1);
b_size++;
m = m - 1;
n = k;
}
}
else /* m > n */ {
int t = log(n / m);
int i = m + 1 - pow(2, t);
if (b[n - 1] < a[i - 1]) {
printf("Decreasing mn");
m = m - pow(2, t);
}
else {
/*int k = binsearch(i - 1, m, b[n - 1], a) + 1;*/
int k = binsearch(a, i - 1, m, b[n - 1]) + 1;
printf("Inserting %d into a at %dn", b[n - 1], k - 1);
insert(b, a, a_size, k-3, n-1);
a_size++;
n = n - 1;
m = k;
}
}
}
printf("%d %dn", m, n);
}
int main(){
int m = 3;
int n = 16;
int A[] = { 87, 503, 512 };
int B[] = { 61, 154, 170, 275, 426, 509, 612, 653, 677, 703, 765, 897, 908 };
merge(A, B, m, n);
for (int i = 0; i<n; i++){
printf("%d ", B[i]);
}
system("pause>0");
return 0;
}
这是程序的逻辑:
初步:A是长度为m的整数数组,B是长度为n的整数数组。此外,两个数组中的元素都是不同(与两个数组中的元素不同)并且按升序排列。
步骤1:如果n或m为零,则停止。否则,如果m>n,则设置t=[log(m/n)]并转到步骤4,否则设置t=[log(n/m)]。
步骤2:比较A[m]和B[n+1-2t]。如果A[m]较小,则设置n=n–2^t并返回步骤1。
步骤3:使用二进制搜索(需要再进行t次比较),将A[m]插入其中的适当位置B[n+1-2t]。。。B[n]。如果k是最大的,使得B[k]<A[m],设m=m-1和n=k。返回步骤1。
第4步:(第4步和第5步类似2和4,互换n和m、A和B的作用)如果B[n]<A[m+1-2t],设置m:=m-2t并返回步骤1。
步骤5:插入B[n]在A中的适当位置。如果k是极大的,使得A[k]<B[n],设置m=k和n=n-1。返回步骤1。
一个问题是因为binsearch。我认为你用错了。binsearch如果找不到元素,则返回-1
,否则返回该元素在数组中的索引。据我所见和测试,我认为你的binsearch
版本确实做到了这一点
您正在另一个数组(B
或A
)中搜索一个数组的元素(A
或B
)binsearch返回-1
,因为A
和B
是不同的。CCD_ 15总是返回CCD_
在C/C++中,数组是固定大小的。一旦确定了大小,就不能更改。A
的大小是3,B
的大小是13增加数组的大小是错误的
附录
二进制搜索实验
#include<iostream>
#include<cmath>
using namespace std;
/* binsearch from The C Programming Language (Second Edition) */
int binsearch1(int search_val, int array[], int array_len) {
int low, high, mid;
low = 0;
high = array_len - 1;
while (low <= high) {
mid = (low + high) / 2;
if (search_val < array[mid])
high = mid - 1;
else if (search_val > array[mid])
low = mid + 1;
else
return mid;
}
return -1; /* no match */
}
/* binsearch from SO question: http://stackoverflow.com/q/34246941/1566187 */
int binsearch2(int array[], int first, int last, int search_key) {
int index;
if (first > last)
index = -1;
else {
int mid = (first + last) / 2;
if (search_key == array[mid])
index = mid;
else
if (search_key < array[mid])
index = binsearch2(array, first, mid - 1, search_key);
else
index = binsearch2(array, mid + 1, last, search_key);
}
return index;
}
/*
* Comparing binsearch from reference book and So question
*/
int main() {
int m = 3;
int A[] = {87, 503, 512};
int i = binsearch1(503, A, m);
int j = binsearch2(A, 0, m - 1, 503);
cout << "Elements are found at indices" << endl;
cout << i << ", " << j << endl;
i = binsearch1(99, A, m);
j = binsearch2(A, 0, m - 1, 99);
cout << "Element are not found, thus return is -1" << endl;
cout << i << ", " << j << endl;
return 0;
}
- 我似乎对if/else的基本语句有问题:/
- 我在范围内未声明的错误类有问题
- 两种访问I2C总线的方法有什么区别?
- 我的C++语言蛮力算法有问题
- 我关于函数"Assert"的C++代码有问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++类中的友元函数有问题?
- 我对数组即 0x6dfe78 有问题
- 我对 std::unique(算法)C++有问题
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- 我的堆栈中的弹出方法有什么问题?
- 我实现谓词的方法有什么问题
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- 谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题
- TinyXML - 任何跳过有问题的DOCTYPE标签的方法
- 我的插入方法和binsearch方法有问题吗
- 试图了解我的泡沫排序方法有什么问题
- 创建一个有三种方法可供选择的加密程序!它有问题,我不知道如何解决
- 单元测试-我试图用googlemock模拟一个简单的c++方法有什么问题?
- 黑客世界,霍格沃茨的女巫们.我的方法有什么问题?