美文网首页
数据结构与算法-排序/二分查找

数据结构与算法-排序/二分查找

作者: sylvainwang | 来源:发表于2017-12-18 16:58 被阅读24次
算法中基础中的基础,排序/二分查找

排序

1.快排QuickSort
def quicksort(nums):
    return QS(nums,0,len(nums)-1)

def QS(nums,left,right):
    if left >= right:
        return nums
    key = nums[left]
    lp = left 
    rp = right
    while lp < rp:
        while nums[rp] >= key and lp<rp:
            rp -= 1
        while nums[lp] <= key and lp<rp:
            lp += 1
        nums[rp],nums[lp] = nums[lp],nums[rp] # 碰到左右需要交换的元素时交换

    nums[left],nums[lp] = nums[lp],nums[left] # 此时lp = rp,与key元素交换,key在中间
    QS(nums,left,lp-1)
    QS(nums,lp+1,right)
    return nums

if __name__ == '__main__':
    lst = [5,4,6,2,7,3,8]
    print(quicksort(lst))

归并排序
def merge_sort(lst):
    if len(lst) <=1:
        return lst
    else:
        middle = len(lst)//2
        left = lst[:middle]
        right = lst[middle:]
        merge_sort(left)
        merge_sort(right)
        i,j,k = 0,0,0
        while i < len(left) and j< len(right):
            if left[i] <= right[j]:
                lst[k] = left[i]
                i = i + 1
            else:
                lst[k] = right[j]
                j = j + 1
            k = k + 1
        while i < len(left):
            lst[k] = left[i]
            i += 1
            k += 1
        while j < len(right):
            lst[k] = right[j]
            j += 1
            k += 1
        return lst

堆排序

def shiftdown(lst,i,n):
    h = 2 * i + 1
    while h <= n:
        if h + 1 <= n and lst[h+1] > lst[h]:
            h = h + 1
        if lst[h] > lst[i]:
            lst[i],lst[h] = lst[h],lst[i]
        else:
            break
        i = h
        h = 2 * i + 1


def heapSort(lst):
    length = len(lst)
    for j in range(length//2 - 1,-1,-1):
        shiftdown(lst,j,length-1)
    print('lst_tmp',lst)
    for i in range(length-1,0,-1):
        lst[0],lst[i] = lst[i],lst[0]
        shiftdown(lst,0,i-1)
    print('sorted lst',lst)

1. 二分查找
#coding=utf-8


def bi_search(nums,target):
    left = 0
    right = len(nums) - 1
   
    res = []
    while left <= right:
        mid =  (left + right) // 2 #left + (right - left) //2 
        #print(left,right)
        if nums[mid] == target:
            return mid
        elif nums[mid] > target:
            right = mid -1 
        elif  nums[mid] < target:
            left = mid + 1
    
    return None
    

相关文章

  • 排序算法

    算法与数据结构基础 查找算法: 二分查找法: 简介:二分查找法又被称为折半查找法,用于预排序的查找问题 过程: 如...

  • 排序查找c++

    排序算法 选择排序 顺序查找 二分查找

  • 想去阿里——这是你必备的实力

    算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景) 二分查找和各种变种的二分查找 各类排序算法以及...

  • 想去阿里——这是你必备的实力

    算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景)二分查找和各种变种的二分查找各类排序算法以及复杂...

  • 基本算法

    冒泡算法 选择排序 插入排序 顺序查找 二分查找

  • 其难杂症

    排序 冒泡排序,快速排序 查找算法 二分查找算法 Array方法 push/unshift,pop/shift,m...

  • Chapter 2 Foundation of Algorith

    Chapter 2 插入排序 线性查找 选择算法 归并排序算法 二分查找算法 冒泡排序 插入排序 循环不...

  • 查找

    二分查找适用于有序表查找, 包括二叉排序树 散列查找请看本博客数据结构与算法hash表文章http://www.j...

  • 基础算法(查找 , 排序)

    算法分析 渐进符号 - (O , Ω , θ) 查找算法 二分查找 - O(logn) 排序算法 直接插入排序 -...

  • OC常用算法

    排序算法 冒泡排序 选择排序 快速排序 插入 二分查找

网友评论

      本文标题:数据结构与算法-排序/二分查找

      本文链接:https://www.haomeiwen.com/subject/ccmmwxtx.html