冒泡
// 每次两两比对,交换,将大的送到右边,所以第i次比对到倒数第i个数即可
def maopao(nums):
if len(nums) <= 1:
return nums
for i in range(len(nums)-1):// 一共需要n-1次遍历,每次找到一个,最后剩下一个最小的
for j in range(len(nums)-1-i)://每次遍历右侧已经有正确顺序的i+1个大数,且考虑到下面比对含有j+1所以j循环到len(nums)-1-i即可
if nums[j] > nums[j+1]:
swap(nums,j,j+1)
选择排序
//每次找到i右侧剩余里面最小的 跟目前的位置交换
def xuanze(nums):
if len(nums) <= 1:
return nums
for i in range(len(nums)-1)://只需要遍历n-1次,剩下的是最大的
index = i
for j in range(i+1,len(nums)):
if nums[j] < nums[index]://保存最小的数的index
index = j
swap(nums, i, index)
插入排序
//跟打牌摸牌一样,每次将后面一个数依次交换到前面合适的位置
def charu(nums):
if len(nums) <= 1:
return nums
for i in range(1,len(nums)):
index = i
for j in range(i):
if nums[index] < nums[i-1 - j]://直到碰到比自己小的
swap(nums, index, i-1-j)
index = i-1 - j
else:
break
快排
//为何先动j,是为了无论何时交换都保证移到左边的比K(选取的左端点,且目标从小到大)要小
def kuaipai(nums,L,R):
if R == L :
return 0
i = L
j = R
K =nums[L]
while(i < j):
while(i < j and nums[j]>=K):
j -= 1
while(i < j and nums[i]<=K):
i += 1
if i == j :
nums[L] = nums[i]
nums[i] = K
kuaipai(nums, L, i)
kuaipai(nums, i+1, R)
else:
swap(nums, i, j)
并归排序
//取一半数组,假设有序,然后合并数组
def binggui(nums):
if len(nums) <= 1:
return nums
mid = int(len(nums)/2)
result = []
nums1 = binggui(nums[:mid])
nums2 = binggui(nums[mid:])
i = 0
j = 0
while(i < len(nums1) and j < len(nums2)):
if nums1[i] <= nums2[j]:
result.append(nums1[i])
i+=1
elif nums1[i] > nums2[j]:
result.append(nums2[j])
j+=1
while(i<len(nums1)):
result.append(nums1[i])
i+=1
while(j<len(nums2)):
result.append(nums2[j])
j+=1
return result