编写程序,实现以下功能: (1) 建立一个整数构成的顺序表。 (2) 根据用户输入的查找值,实现顺序表的顺序查找。 (3) 建立一个有序的整数构成的顺序表(可直接利用前面排序实验的结果)。 (4) 根据用户输入的查找值,实现二分查找,并输出比较的元素、元素的比较次数等。要求实现递归和非递归算法。 (5) *模拟统计查找长度, 随机产生100,200,500,1000,2000等若干个随机整数,在(3)中定义的有序表中查找这些值,统计查找成功和查找不成功的平均查找长度。
时间: 2024-02-03 12:15:32 浏览: 60
以下是Python3的实现代码:
```python
# 定义顺序表类
class SeqList:
def __init__(self, data=None):
if data:
self.data = data.copy()
self.length = len(data)
else:
self.data = []
self.length = 0
# 顺序查找
def seq_search(self, key):
for i in range(self.length):
if self.data[i] == key:
return i
return -1
# 二分查找(递归算法)
def binary_search_recursive(self, key):
return self._binary_search_recursive(key, 0, self.length - 1)
def _binary_search_recursive(self, key, low, high):
if low > high:
return -1
mid = (low + high) // 2
if self.data[mid] == key:
return mid
elif self.data[mid] > key:
return self._binary_search_recursive(key, low, mid - 1)
else:
return self._binary_search_recursive(key, mid + 1, high)
# 二分查找(非递归算法)
def binary_search_iterative(self, key):
low, high = 0, self.length - 1
while low <= high:
mid = (low + high) // 2
if self.data[mid] == key:
return mid
elif self.data[mid] > key:
high = mid - 1
else:
low = mid + 1
return -1
# 测试代码
if __name__ == '__main__':
# 建立整数构成的顺序表
seq_list1 = SeqList([3, 5, 1, 4, 2])
print(seq_list1.data)
# 顺序查找
index = seq_list1.seq_search(4)
if index != -1:
print('找到了,下标为', index)
else:
print('没找到')
# 建立有序的整数构成的顺序表
seq_list2 = SeqList([1, 2, 3, 4, 5])
print(seq_list2.data)
# 二分查找(递归算法)
index = seq_list2.binary_search_recursive(4)
if index != -1:
print('找到了,下标为', index)
else:
print('没找到')
# 二分查找(非递归算法)
index = seq_list2.binary_search_iterative(4)
if index != -1:
print('找到了,下标为', index)
else:
print('没找到')
# 模拟统计查找长度
import random
length_list = [100, 200, 500, 1000, 2000]
for n in length_list:
seq_list = SeqList(sorted(random.sample(range(n * 10), n)))
total_length = 0
found_count = 0
for i in range(n):
key = random.randint(0, n * 10 - 1)
index = seq_list.binary_search_iterative(key)
if index != -1:
total_length += index + 1
found_count += 1
else:
total_length += n
print('n =', n, '时,平均查找长度为', total_length / n, ',查找成功率为', found_count / n)
```
注意:在模拟统计查找长度的部分,为了简化代码,使用了Python内置的sorted和random模块。实际上,这些函数底层也需要排序和随机化算法,因此并不是真正意义上的“原始数据”。如果需要更加精确的模拟,可以自己编写排序和随机化算法。
阅读全文