二分查找
- 只可以作用在有序序列中
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的希尔排序
- 当数量大时,用内存换时间
- 比如说10个元素,分成5(10/2)组,每组两个元素,每个元素之间差5个间隔,这样(1,6)(2,7)。。分别进行排序。(本身也不会重排)
- 排序完毕之后再分成2组(5//2),每个元素之间差一个间隔,得到(1,3,5,7,9)和(2,4,6,8,10),然后再排序。
- 最终所有的元素合并成一组,进行排序
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))