paixu
排序
冒泡排序
- 1.将原始列表中的最大值找出且放置在列表最右侧(将元素两两比较,将数值大的数逐步向后移动)
- 2.重复执行步骤1
#将原始列表中的最大值找出且放置在列表最右侧(将元素两两比较,将数值大的数逐步向后移动)
def sort(alist):
for i in range(len(alist)-1):
if alist[i] > alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
return alist
def sort(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
选择排序
- 1.将列表中的最大值一次找出,放置在列表最右侧
#将列表中的最大值的下标找到
def sort(alist):
max_index = 0 #最大值的下标
for i in range(1,len(alist)):
if alist[max_index] < alist[i]:
max_index = i
print(max_index)
#将列表中的最大值一次找出,放置在列表最右侧
def sort(alist):
max_index = 0 #最大值的下标
for i in range(1,len(alist)):
if alist[max_index] < alist[i]:
max_index = i
alist[max_index],alist[len(alist)-1] = alist[len(alist)-1],alist[max_index]
return alist
def sort(alist):
for j in range(len(alist),1,-1):
max_index = 0 #最大值的下标
for i in range(1,j): #len(alist) == > j
if alist[max_index] < alist[i]:
max_index = i
alist[max_index],alist[j-1] = alist[j-1],alist[max_index]
return alist
插入排序
def sort(alist):
i = 1
if alist[i] < alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
def sort(alist):
i = 2
while i > 0:
if alist[i] < alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
i -= 1
def sort(alist):
for i in range(1,len(alist)):
while i > 0:
if alist[i] < alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
i -= 1
else:
break
return alist
希尔排序
插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。
def sort(alist):
gap = len(alist) // 2
#将插入排序当做增量为1的希尔排序
for i range(1,len(alist)):
while i > 0 :
if alist[i] < alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
i -= 1
else:
break
def sort(alist):
gap = len(alist) // 2
#将增量设置成gap
for i range(gap,len(alist)):
while i > 0 :
if alist[i] < alist[i-gap]: #
alist[i],alist[i-gap] = alist[i-gap],alist[i]
i -= gap
else:
break
#继续缩小增量
def sort(alist):
gap = len(alist) // 2
while gap >= 1:
#将增量设置成gap
for i in range(gap,len(alist)):
while i > 0 :
if alist[i] < alist[i-gap]:
alist[i],alist[i-gap] = alist[i-gap],alist[i]
i -= gap
else:
break
gap //= 2
return alist
归并排序
- 归并排序采用分而治之的原理:
- 将一个序列从中间位置分成两个序列;
- 在将这两个子序列按照第一步继续二分下去;
- 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
- 如何合并?
- 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
- 在将这两个子序列按照第一步继续二分下去;
- 将一个序列从中间位置分成两个序列;
下图中的倒数第三行表示为第一次合并后的数据。其中一组数据为 4 8 , 5 7。该两组数据合并方式为:每一小组数据中指定一个指针,指针指向每小组数据的第一个元素,通过指针的偏移指定数据进行有序排列。排列情况如下:
- p1指向4,p2指向5,p1和p2指向的元素4和5进行比较,较小的数据归并到一个新的列表中。经过比较p1指向的4会被添加到新的列表中,则p1向后偏移一位,指向了8,p2不变。
2.p1和p2指向的元素8,5继续比较,则p2指向的5较小,添加到新列表中,p2向后偏移一位,指向了7。
3.p1和p2指向的元素8,7继续比较,7添加到新列表中,p2偏移指向NULL,比较结束。
4.最后剩下的指针指向的数据(包含该指针指向数据后面所有的数据)直接添加到新列表中即可。
def merge_sort(alist):
n = len(alist)
#结束递归的条件
if n <= 1:
return alist
#中间索引
mid = n//2
left_li = merge_sort(alist[:mid])
right_li = merge_sort(alist[mid:])
#指向左右表中第一个元素的指针
left_pointer,right_pointer = 0,0
#合并数据对应的列表:该表中存储的为排序后的数据
result = []
while left_pointer < len(left_li) and right_pointer < len(right_li):
#比较最小集合中的元素,将最小元素添加到result列表中
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
#当左右表的某一个表的指针偏移到末尾的时候,比较大小结束,将另一张表中的数据(有序)添加到result中
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
alist = [3,8,5,7,6]
print(merge_sort(alist))
快拍
def sort(alist,start,end):
low = start
high = end
#结束递归的条件
if low > high:
return
mid = alist[low]
while low < high:
while low < high:
if alist[high] > mid:
high -= 1
else:
alist[low] = alist[high]
break
while low < high:
if alist[low] < mid:
low += 1
else:
alist[high] = alist[low]
break
# if low == high:
alist[low] = mid
sort(alist,low+1,end) #将基准右侧的子列表进行递归操作
sort(alist,start,high-1)
return alist
def sort(alist,start,end):
low = start
high = end
#递归结束的条件
if low > high:
return
#基准:最左侧的数值
mid = alist[low]
#low和high的关系只能是小于,当等于的时候就要填充mid了
while low < high:
while low < high:
if alist[high] > mid:
high -= 1
else:
alist[low] = alist[high]
break
while low < high:
if alist[low] < mid:
low += 1
else:
alist[high] = alist[low]
break
#当low和high重复的时候,将mid填充
if low == high:
alist[low] = mid #or alist[high] = mid
break
#执行左侧序列
sort(alist,start,high-1)
#执行右侧序列
sort(alist,low+1,end)
return alist
dotnet-cnblog D:\python\python_code\面试\排序.md
排序.md