冒泡
// 每次两两比对,交换,将大的送到右边,所以第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