sort algorithm

#!/usr/bin/env python
# -*- coding:utf8 -*-

def bubble_sort(li):
    n = len(li)

    # j 代表 当前无序序列的个数
    for j in range(n, 1, -1):
        # 1 将序列最大数移动到无序序列尾端(遍历比较,前大后小则交换)
        swap_count = 0
        for i in range(0,j-1):
            if li[i] > li[i+1]:
                li[i], li[i+1] = li[i+1], li[i]
                swap_count += 1
        # 若没有发生交换,则算法退出
        if 0 == swap_count:
            return

    # 2 对剩余无序序列li[0:n-1]重复步骤1

def select_sort(li):
    n = len(li)

    # j 代表当前有序序列的个数(无序序列的首个元素位置)
    for j in range(0,n-1):
        # 1 找到最小元素并记录该值索引(遍历比较,小则更新)
        min_index = j
        for i in range(j + 1, n):
            if li[i] < li[min_index]:
                min_index = i

        # 至此,第min_index个元素就是最小元素
        # 2 交换最小值和无序序列首个元素
        li[min_index], li[j] = li[j], li[min_index]

    # 3 对剩余无序序列li[1:n]重复步骤1 2

def insert_sort(li):
    n = len(li)

    #j 代表当前有序序列的个数
    for j in range(1, n):
        # 1 将无序序列首个元素向前插入有序序列(反向遍历,前大后小则交换)
        for i in range(j, 0, -1):
            if li[i-1] > li[i]:
                li[i-1], li[i] = li[i], li[i-1]
            else:
                # 若没有发生前大后小则步骤1结束
                break

    # 2 对剩余无序序列重复步骤1

def shell_sort(li):
    n = len(li)
    # 1 确定步长分组(步长=长度的一半)
    gap = n // 2

    while gap > 0:
        # 2 组内插入排序
        for j in range(gap, n):
            for i in range(j, 0, -gap):
                if li[i-gap] > li[i]:
                    li[i-gap], li[i] = li[i], li[i-gap]
                else:
                    break
        # 3 缩小步长一半,重复步骤2
        gap = gap // 2

def quick_sort(li, start, end):
    if start >= end:
        return

    # 1 确定基准值已经基准索引(中间位置)
    pivot_index = (start + end) // 2
    head  = start
    tail = end

    while head < tail:
        # 2 在基准值前找比基准值大的元素(向后遍历),交换并更新基准索引
        while head < pivot_index and li[head] <= li[pivot_index]:
            head += 1
        li[head], li[pivot_index] = li[pivot_index], li[head]
        pivot_index = head
        # 3 在基准值后找比基准值小的元素(向前遍历),交换并更新基准索引
        while tail > pivot_index and li[tail] >= li[pivot_index]:
            tail -= 1
        li[tail], li[pivot_index] = li[pivot_index], li[tail]
        pivot_index = tail
        # 4 重复步骤2 3 直到首尾重合

    # 至此,原序列被分成li[start:pivot_index]和li[pivot_index+1:end+1]
    # 5 对前后序列重复步骤1 2 3 4
    quick_sort(li, start, pivot_index-1)
    quick_sort(li, pivot_index+1, end)
def merge_sort(li):
    n = len(li)
    if n <= 1:
        return
    # 1 递归分解,分到不能分为止
    left = li[:n//2]
    right = li[n//2:]
    merge_sort(left)
    merge_sort(right)

    # 2 返回合并,合并两个有序序列(同时遍历,选择小的放到新序列li)
    # left 和right已经有序--->因为我调用了merge_sort这个排序函数对left和right进行了排序
    li[:] = []

    l_index = 0
    r_index = 0

    while l_index < len(left) and r_index < len(right):
        if left[l_index] <= right[r_index]:
            li.append(left[l_index])
            l_index += 1
        else:
            li.append(right[r_index])
            r_index += 1

    # 至此,某个序列遍历完了,将另一个序列的后续元素追加到li后
    li += left[l_index:]
    li += right[r_index:]

def binary_search1(li, item):
    # 1 判断中间值是否是待查元素
    n = len(li)
    if n <= 0:
        return False

    mid = n // 2
    if li[mid] == item:
        return True
    # 2 对前子序列或后子序列递归执行
    elif item < li[mid]:
        return binary_search1(li[:mid], item)
    else:
        return binary_search1(li[mid+1:], item)

def binary_search2(li, item):
    start = 0
    end = len(li) - 1

    while start <= end:
        # 1 判断中间值是否是待查元素
        mid = (start + end) // 2
        if li[mid] == item:
            return True
        # 2 向前或向后缩小一半范围,重复步骤1
        if item < li[mid]:
            end = mid - 1
        else:
            start = mid + 1

    # 至此范围缩小到不存在还没查到
    return False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值