算法

109 阅读1分钟

二分查找

  • 只可以作用在有序序列中
def findItem(alist,item):
    left = 0 
    right = len(alist)-1
    find = False
    while left <= right:
    #中间元素下标
        mid = (left+right)//2

        if item > alist[mid]:#如果查找的元素在列表中存在,一定在中间元素的右侧
            left = mid + 1
        elif item < alist[mid]:
            right = mid - 1
        else:
            find = True#中间元素等于查找的元素
            break
    return find

冒泡排序

def maopao(alist):
    for j in range(len(alist)-1):
        for i in range(len(alist)-1-j):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
    return alist

选择排序

def xuanze(alist):
	for j in range(len(alist)-1):
		max_index = 0 #保存最大元素的下标
		for i in range(len(alist)-1-j):
			if alist[i+1] > alist[max_index]:
				max_index = i+1
		alist[max_index],alist[len(alist)-1-j] = alist[len(alist)-1-j],alist[max_index]
	return alist

插入排序

将序列分成有序和无序两个部分,将无序部分的每个元素一次插入到有序部分的每一个部分。

def charu(alist):
	for i in range(1,len(alist)):
		while i >= 1:
			if alist[i] < alist[i-1]:
				alist[i],alist[i-1] = alist[i-1],alist[i]
				i -= 1 # 和有序部分所有的元素比较
			else:
				break
	return alist

希尔排序

希尔排序:

  • gap:初始值就是序列个数整除2
  • gap的作用:
    • gap表示间隔
    • gap表示组数
  • 插入排序就是增量为1的希尔排序
  • 当数量大时,用内存换时间
  1. 比如说10个元素,分成5(10/2)组,每组两个元素,每个元素之间差5个间隔,这样(1,6)(2,7)。。分别进行排序。(本身也不会重排)
  2. 排序完毕之后再分成2组(5//2),每个元素之间差一个间隔,得到(1,3,5,7,9)和(2,4,6,8,10),然后再排序。
  3. 最终所有的元素合并成一组,进行排序
def xier(alist):
    gap = len(alist) // 2
    while gap >= 1:
        for i in range(gap,len(alist)):
            while i >= gap:
                if alist[i] < alist[i-gap]:
                    alist[i],alist[i-gap] = alist[i-gap],alist[i]
                    i -= gap
                else:
                    break
        gap //= 2
    return alist

快速排序

def quickSort(alist,start,end):
    low = start
    hight = end

    if low > hight:
        return #结束递归的条件

    mid = alist[low]
    while low < hight:
        while low < hight:
            if alist[hight] > mid:
                hight -= 1
            else:
                alist[low] = alist[hight]
                break
        while low < hight:	
            if alist[low] < mid:
                low += 1
            else:
                alist[hight] = alist[low]
                break	
        if low == hight:
                alist[low] = mid

    quickSort(alist,start,hight-1)
    quickSort(alist,low+1,end)
    return alist
alist = [3, 5, 8, 1, 2, 9, 4, 7, 6]	
print(quickSort(alist,0,len(alist)-1))