排序和二分查找(Python)

目录

[排序]

归并排序

快速排序:

插入排序:

冒泡排序

选择排序

相关练习:

[查找]

二分查找:

模糊二分查找:

相关练习


[排序]

归并排序

#归并
def mSort(nums): #分为两个列表,分别排序
    if len(nums)<=1:
        return nums
    else:
        m = len(nums)//2
        print 'len(nums): ',len(nums)
        print 'nums: ',nums
        print 'm: ',m
        left = mSort(nums[:m])
        right = mSort(nums[m:])
        ret = merge(left,right)
        return ret

def merge(left,right):#合并两个列表
    i = 0
    j = 0
    k = 0
    ret =[]
    print '--------'
    print 'left: ',left
    print 'right: ',right
    while i<len(left) and j< len(right):
        if left[i]<right[j]:
            ret.append(left[i])
            i += 1
        else:
            ret.append(right[j])
            j += 1
    ret += left[i:]
    ret += right[j:]
    return ret

快速排序:

#快排、
def quickSort(nums):
    qSort(nums,0,len(nums)-1)

def qSort(nums,low,high):
    if low<high:
        pivot = partition(nums,low,high)
        qSort(nums,low,pivot-1)#低位排序
        qSort(nums,pivot+1,high)#高位排序
        
def partition(nums,low,high):#枢纽点
    pivotkey = nums[low]
    while low<high:
        while low<high and nums[high]>=pivotkey:
            high -= 1
        nums[low],nums[high] = nums[high],nums[low]
        
        while low<high and nums[low]<=pivotkey:
            low += 1
        nums[low],nums[high] = nums[high],nums[low]
    return low

插入排序:

#插入排序、
def insertOrder(nums):
    if not nums:
        return
    ret = [nums[0]]
    for n in nums[1:]:
        print 'for: ',n
        print 'ret: ',ret
        if n <= ret[0]:
            ret.insert(0,n)
            continue
        i = 1
        while i<len(ret):
            if n>ret[i-1] and n<=ret[i]:
                break
            i+=1
        ret.insert(i,n)
        
    return ret

冒泡排序

#冒泡、
def paopao(nums):
    flag = False
    for i in range(len(nums)):
        for j in range(len(nums)-1,i,-1):
            if nums[j]<nums[j-1]:
                flag = True
                nums[j],nums[j-1] = nums[j-1],nums[j]
        if not flag:
            break
    return nums

选择排序

#选择、
def selectOrder(nums):
    for i in range(len(nums)):
        minindex = len(nums)-1
        for j in range(len(nums)-1,i-1,-1):
            if nums[j]<nums[minindex]:
                minindex = j
        nums[i],nums[minindex] = nums[minindex],nums[i]
    return nums

相关练习:

[滑动窗口最大值]

给定一个数组 nums,有一个大小为 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if nums==[] or k==1:
            return nums
        ret = []
        now_max = max(nums[:k])
        ret.append(now_max)
        for i in range(1,len(nums)-k+1):
            if nums[i+k-1] >= now_max:
                now_max = nums[i+k-1]
            elif nums[i-1]==now_max:
                now_max = max(nums[i:i+k])
                
            ret.append(now_max)
        return ret

[查找]

二分查找:

#二分查找
def halfSearch(nums,num):
    if not nums:
        return 
    if num>nums[-1] or num<nums[0]:
        return
    if num == nums[0]:
        return 0
    elif num == nums[-1]:
        return len(nums)-1
    
    low = 0
    high = len(nums)-1
    while low <= high:
        medim = (high+low)/2
        print 'm: ',medim
        if num>nums[medim]:
            low = medim+1
        elif num < nums[medim]:
            high = medim-1
        else:
            return medim
    return

模糊二分查找:

(找到数组中大于等于目标元素的第一个元素的位置)

#模糊二分[大于等于给定值的第一个元素的位置]
def fuzzyHalfSearch(nums,num):
    if not nums:
        return 
    if num>nums[-1]:
        return
    if num <= nums[0]:
        return 0
    elif num == nums[-1]:
        return len(nums)-1
    
    low = 0
    high = len(nums)-2
    while low <= high:
        medim = (high+low)/2
        if num>nums[medim] and num<=nums[medim+1]:
            return medim+1
        elif num > nums[medim+1]:
            low = medim+1
        elif num <= nums[medim]:
            high = medim
    return

相关练习

[x 的平方根]

计算并返回 x 的平方根,其中 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

方法1:

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x==0 or x==1:
            return x
        low =1
        high = x-1
        ans = 1
        while low <= high:
            medim = (low+high)/2
            if x>medim*medim:
                low = medim+1
                ans = medim
            elif x< medim*medim:
                high = medim-1
            else:
                return medim
        
        return ans

方法2:

牛顿法:https://en.wikipedia.org/wiki/Integer_square_root#Algorithm_using_Newton's_method

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        
        if x <= 1:
            return x
        r = x
        while r > x / r:
            r = (r + x / r) // 2
        return int(r)

猜你喜欢

转载自blog.csdn.net/m0_38019841/article/details/88235655