Python之排序与查找

排序

      排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。排序方法有很多种,下面举例说明:

    冒泡排序

          冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

# 冒泡排序
def bubbling_sort(data):
    for i in range(len(data) - 1):
        for j in range(i + 1, len(data)):
            # 从头开始,每取一个元素都和后面的所有元素相比
            if data[i] > data[j]:
                data[i], data[j] = data[j], data[i]

    快速排序

         从数列中挑出一个元素,称为 "基准"pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。   

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def sub_sort(data, low, high):
    # 将第一个值作为基础值备份出来
    key = data[low]
    while low < high:
        # 从后面开始将小于基础值的元素往前移动到最前面
        while low < high and data[high] > key:
            high -= 1
        data[low] = data[high]
        # 从前面开始将大于基础值的元素往后移动到最后面
        while low < high and data[low] < key:
            low += 1
        data[high] = data[low]
    # 前后索引集中在一起时结束,将基础值填充进去,并返回所在索引
    data[low] = key
    return low


def quick(data, low, high):
    # low 开头索引
    # high 末尾索引
    if low < high:
        key = sub_sort(data, low, high)
        # 将利用基础值分割的左右两部分迭代进行处理,直到结束
        quick(data, low, key - 1)
        quick(data, key + 1, high)

    插入排序

             对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,插入排序在实现上,通常在从后面向前扫描过程中,需要反复把已排序元素逐步向后挪威,为最新元素提供插入空间

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def insert_sort(data):
    for i in range(1, len(data)):
        # 从第二个开始取一个值
        x = data[i]
        # 当前索引
        j = i
        # 往前依次找比当前值大的进行交换,直到没有
        while j > 0 and data[j - 1] > x:
            data[j] = data[j - 1]
            j -= 1
        # 将取到值插入进去
        data[j] = x

    选择排序

            工作原理为,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕

 示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def choose_sort(data):
    for i in range(len(data) - 1):
        # 假定本次是最小
        min_index = i
        for j in range(i + 1, len(data)):
            # 发现后面有比本次还小,则标记它为最小
            if data[j] < data[min_index]:
                min_index = j
        # 如果最小的不是本次最小则交换位置
        if min_index != i:
            data[i], data[min_index] = data[min_index], data[i]

 

查找

    二分法查找

       例如,随机一个1~100中的数,猜一猜数字是几,我们会先猜中数50,如果小了就会接着猜75,如果是大了就会接着猜25,以此类推。

    

data = [i for i in range(1, 101)]


# 找出指定数据的下标
def search(data, key):
    low = 0
    high = len(data) - 1
    while low <= high:
        mid = (low + high) // 2
        if data[mid] > key:
            high = mid - 1
        elif data[mid] < key:
            low = mid + 1
        else:
            return mid
    return -1


print(search(data, 80))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章