本文共 1801 字,大约阅读时间需要 6 分钟。
题目:线性表(a1,a2,a3,…,an)中元素递增有序且按顺序存储在计算机中。要求设计一个算法完成用最少时间在表中查找值为x的元素,若找到将其与后继元素位置相交换,若找不到将其插入表中并使表中元素仍递增有序。
算法思想:有序顺序表,可以用二分查找(折半查找)。
int BinarySearch(ElemType A[], ElemType x){ int low = 0, high = n-1, mid; //low记录最左边元素位置,high记录最右边元置,mid记录中间位置 while(low<=high){ mid = (low+high)/2; //mid记录最中间位置(不为整数时,记录前面的那个位置) if(L.data[mid] < x) low = mid+1; // 中间元素小于x,x在后半部分,low设置为mid下一个位置 else if (L.data[mid] > x) high = mid-1; //x在前半部分,high设置为mid前一个元素的位置 else return mid; // mid位置的值等于x,返回这个位置(下标,一个数字) } return -1; //查不到x,返回-1表示错误
1 | 3 | 6 | 13 | 18 | 15 | 24 | 28 | 35 |
解析:
主函数调用BinarySearch()函数
void SearchExchangeInsert(ElemType A[], ElemType x){ int res; res = BinarySearch(SqList &L, ElemType x); if(res != -1 && res!= n-1){ temp=A[res]; A[res]=A[res+1]; A[res+1]=temp; } if(res == -1) //二分查找只是返回错误信息,没有找到具体x应该插入的位置 { for(i=n-1; A[i]>x; i--) A[i+1] = A[i]; //从最后一位开始,大于x的元素依次右移一位 A[i+1] = x; }}
解析:
查找13:
low=0 | mid=4 | high=8 | ||||||
1 | 3 | 6 | 13 | 18 | 22 | 24 | 28 | 35 |
else if (L.data[mid] > x) high = mid-1; //x在前半部分,high设置为mid前一个元素的位置
low=0 | mid=1 | high =3 | |
1 | 3 | 6 | 13 |
重新设置上界high,删除了后半部分
if(L.data[mid] < x) low = mid+1; // 中间元素小于x,x在后半部分,low设置为mid下一个位置
low,mid = 2 | high=3 |
6 | 13 |
重新设置下界low
low,high,mid=3 |
13 |
满足mid=x,返回mid。
查找20:
low=0 | mid=4 | high=8 | ||||||
1 | 3 | 6 | 13 | 18 | 22 | 24 | 28 | 35 |
low=5 | mid=6 | high=8 | |
22 | 24 | 28 | 35 |
low,high,mid=5 |
22 |
此时依然满足L.data[mid] > x,接着执行 high = mid-1; high<low, 退出了while循环,返回-1。
转载地址:http://seeii.baihongyu.com/