目录
一、问题描述
编写一个名为find.py的模块,内置两个函数分别实现快速排序与两分查找算法,然后通过导入方式调用该模块为一个包含N个[a,b]内的随机整数的序列排序并查找用户输入的一个数字是否在序列中。
二、快速排序的思想
首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。
“一次划分”的目标是找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之凡关键字大于枢轴的记录均移动至该记录之后。
从而致使一趟排序之后,记录的无序序列R[s..t]将分割成两部分:R[s..i-1]和R[i+1..t], 且
扫描二维码关注公众号,回复: 15945961 查看本文章R[j].key≤ R[i].key ≤ R[j].key
(s≤j≤i-1) 枢轴 (i+1≤j≤t)
python实现起来非常方便,采用“递归”的思想,直接上代码:
def Quick_Sort(myList,start,end): #myList表示输入序列 #start表示起始位置 #end表示终止位置 if start < end: i,j = start,end pivot = myList[i]#枢轴位置 while i < j: while (i < j) and (myList[j] >= pivot): j = j - 1 myList[i] = myList[j] while (i < j) and (myList[i] <= pivot): i = i + 1 myList[j] = myList[i] myList[i] = pivot Quick_Sort(myList, start, i - 1)#递归排序枢轴左侧序列 Quick_Sort(myList, j + 1, end)#递归排序枢轴右侧序列 return myList
三、二分查找(折半查找)
基本思想:首先确定待查记录所在的范围。假设用变量low和high分别表示当前查找区域的首尾下标,将待查关键字key和该区域的中间元素(下标为mid=(low+high)/2)的关键字进行比较。比较的结果有如下三种情况:
(1)key==A[mid].key:查找成功,返回mid的值。
(2)key<A[mid].key:则该记录必定是在位置mid左边的区域(下标从low到mid-1)中,在此区域继续取中间位置记录的关键字进行比较。
(3)key>A[mid].key:元素只可能在右边区域(下标从mid+1到high),在此区域继续取中间位置记录的关键字进行比较。
折半查找算法python编程实现:
def Bin_Search(Mylist,value):
#Mylist为有序序列
#value为待查找的值
low=0
high=len(Mylist)-1
while low <=high:
mid=(low+high)//2
if Mylist[mid]==value:
print('查找成功,元素所在位置为:{}'.format(mid))
return mid
elif Mylist[mid]>value:
high=mid-1
else:
low=mid+1
return -1
将Quick_Sort函数和Bin_Search保存为find.py,用import导入即可。
import find
生成N个[a,b]内的随机整数:
def Myrandom(a,b,N):
lst=[]
for i in range(N):
x=random.randint(a,b)
lst.append(x)
return lst
主函数:
import find
import random
def Myrandom(a,b,N):
lst=[]
for i in range(N):
x=random.randint(a,b)
lst.append(x)
return lst
def main():
a = 0
b = 1000
N = 50
lst=Myrandom(a,b,N)
print('随机生成的N个数的序列:{}'.format(lst))
find.Quick_Sort(lst,0,N-1)
print('QuickSort:')
print(lst)
n = int(input('请输入一个数字:'))
a = find.Bin_Search(lst, n)
if (a == -1):
print('{}未在序列中'.format(n))
if __name__ == '__main__':
main()
运行结果: