1、冒泡排序
'''
核心思想
1、两两比较,较大的元素往后沉,较小的元素往上漂
2、每次进行一轮都会确定最底的那个元素
改进
1、设置一个pos,也就是不交换之前的一个元素,防止下次的遍历到终点
2、如果元素比较不交换了那就提前停止循环
'''
nums = [3,2,7,5,9,10,4,8]
#冒泡排序
def bubbleSort(nums):
for i in range(len(nums)):
k = len(nums)-i
for j in range(k-1):
if nums[j]>nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
return nums
#改进版本
def bubbleSort(nums):
for i in range(len(nums)):
k = len(nums)-i
pos = 0
for j in range(k-1):
if nums[j]>nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
flag = 1
pos = j
k = pos
if not flag:
break
return nums
2、选择排序
'''
核心思想
1、选择一个初始元素,将这个元素认为是最小的元素
2、进行一轮比较如果找到比该元素还小的,则交换位置
3、每一轮的进行都可以找到未排序中最小的元素
'''
nums = [3,2,7,5,9,10,4,8]
#冒泡排序
def selectionSort(nums):
for i in range(len(nums)):
min = i
#找到未排序数组中的最小值
for j in range(i+1,len(nums)):
if nums[j]<nums[min]:
min = j
#交换元素
nums[i],nums[min] = nums[min],nums[i]
return nums
3、插入排序
'''
核心思想
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,从后向前扫描
3、如果当前的元素是小于上一个元素的,那么将前一个元素的值赋给当前元素,然后索引减1
4、重复3步骤,直到找到已经排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置
3、重复2-5即可完成插入排序
'''
nums = [3,2,7,5,9,10,4,8]
#插入排序
def insertionSort(nums):
for i in range(1,len(nums)):
#选取前一个元素和当前元素
preIndex = i-1
current = nums[i]
#如果索引大于等于0 且前一个元素是大于当前元素的,进行移动
while preIndex>=0 and nums[preIndex]>current:
nums[preIndex+1] = nums[preIndex]
preIndex-=1
nums[preIndex+1] = current
return nums
4、希尔排序
5、归并排序
'''
核心思想
1、将原数组的输入序列分成两个子长度为n/2的子序列
2、对这两个子序列分别采用归并排序
3、然后将两个排序好的子序列合并成一个最终的排序序列。
'''
nums = [3,2,7,5,9,10,4,8]
#插入排序
def mergerSort(nums):
if len(nums)<2:
return nums
mid = len(nums)//2
left = nums[:mid]
right = nums[mid:]
return merge(mergerSort(left), mergerSort(right))
#将两个有序的数组合并成一个数组
def merge(left,right):
res = []
while len(left)>0 and len(right)>0:
print(left, '----递归', right)
if left[0]<=right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
if left:
res.extend(left)
if right:
res.extend(right)
return res
6、快速排序
'''
核心思想
1、从数列中挑出一个元素,成为基准
2、重新排序数列,所有比基准小的元素摆放在基准前面,所有比基准数值大的元素摆在基准后面,排序后基准就在数列的中间位置。(分区操作)
3、递归的把小于基准值元素的子数列和大于基准值元素的子数列排序。
'''
nums = [3,2,7,5,9,10,4,8]
#快速排序
def quick_sort(nums,i,j):
if i >= j:
return list
pivot = nums[i]
low = i
high = j
while i < j:
#交换比基准小的到左边
while i < j and nums[j] >= pivot:
j -= 1
nums[i]=nums[j]
#交换比基准大的到右边
while i < j and nums[i] <=pivot:
i += 1
nums[j]=nums[i]
nums[j] = pivot
#递归排序左子数组
quick_sort(nums,low,i-1)
#递归排序右子数组
quick_sort(nums,i+1,high)
return nums