python实现快速排序和二分查找算法

目录

一、问题描述

二、快速排序的思想

三、二分查找(折半查找)


一、问题描述

编写一个名为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

三、二分查找(折半查找)

基本思想首先确定待查记录所在的范围。假设用变量lowhigh分别表示当前查找区域的首尾下标,将待查关键字key和该区域的中间元素(下标mid=(low+high)/2)关键字进行比较。比较的结果有如下三种情况:


(1)key==A[mid].key查找成功,返回mid的值。

(2)key<A[mid].key该记录必定是在位置mid左边的区域(下标lowmid-1)中,在此区域继续取中间位置记录的关键字进行比较。

(3)key>A[mid].key元素只可能在右边区域(下标mid+1high),在此区域继续取中间位置记录的关键字进行比较。

折半查找算法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()

运行结果:

 

猜你喜欢

转载自blog.csdn.net/higerwy/article/details/129354041