直接插入排序:
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从前向后或从后向前扫描,找到相应位置并插入。
参考链接:算法>排序算法之插入排序(python实现)_python插入排序-CSDN博客
算法>排序算法——直接插入排序(图文超详细!)-CSDN博客
易错点:
为什么是if nums[j]>nums[i]。
因为nums[j]是已经排序好的,nums[i]是待插入进行比较的。
如果写反了,那么就是从大到小进行排序。
def zhijieinsert(nums):for i in range (len(nums)):if i !=0:for j in range(0,i):if nums[j]> nums[i]:nums[i],nums[j]=nums[j],nums[i]return numsif __name__ == "__main__":nums = [9,8,2,5,6,7,9,5,1]a = zhijieinsert(nums)print(a)
折半插入排序
折半插入排序,和直接插入排序的方法是一样的,左边的都是已经排序排好的。先判断要插入的数据和左边排好的最后一位的元素相比。如果比它小那么就开始折半插入,把想要进行排序的元素防止temp中,防止元素发生变化。取想要插入元素左边元素中最小的为left,取最大的元素为right。mid为中间元素(向下取整)。如果所插元素小于mid则right移动到mid的左边,如果所插元素大于mid则left移动到mide的右边。直到right小于left,left/(right+1)就是所插元素的位置,然后将所插位置后的元素依次往后移动即可。
易错点:注意right=i-1(因为和插入排序类似,左边的是已经排好序的)
for j in range (i-1,right,-1)表示找到了插入元素的位置,移动后续的元素
while left<=right不成立时,表示插入元素的位置找到,然后退出循环
注意if __name__ == "__main__":这里面是两个等号==
def zhebaninsert(nums):for i in range (1,len(nums)):left=0right=i-1temp = nums[i]while left<=right:mid=int((left+right)/2)if temp<nums[i]:right = mid-1else:left = mid+1for j in range (i-1,right,-1):nums[j+1]=nums[j]nums[right+1]=tempreturn nums
if __name__ == "__main__":nums= [1,2,9,4,5,3,7,6,9,2,8]a = zhebaninsert(nums)print(a)
相似题:代码随想录(day1)二分法-CSDN博客
冒泡排序:
从列表的第一个数字开始进行比较,判断该数和下一个数之间的大小关系,如果该数比右边的数大,则交换位置;否则不变。一般一轮可以确定最大的数字,在列表的最后一位。
参考链接:python 冒泡算法>排序算法(超级详细)_冒泡排序python-CSDN博客
代码:
注意:非的写法是not !!!
def buddle(num):for i in range (len(num)-1):flag = Falsefor j in range (len(num)-i-1):if num[j]>num[j+1]:num[j],num[j+1] = num[j+1],num[j]flag = Trueif not flag:break
if __name__ =='__main__':num = [1,2,8,9,6,4]buddle(num)print(num)