暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python实现多种排序

Jeff的技术栈 2021-08-04
272

排序

  1. 常见的时间复杂度(按效率排序)

  2. O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)


  3. 如何一眼判断时间复杂度?

  4. 循环减半的过程O(logn)

  5. 几次循环就是n的几次方的复杂度



  6. 空间复杂度:用来评估算法内存占用大小的一个式子

  7. “空间换时间”

冒泡排序

  1. '''

  2. 原数据:9, 8, 7, 1, 2

  3. 第一趟:8,7,1,2,9

  4. 第二趟:7,1,2,8,9

  5. 第三趟:1,2,7,8,9

  6. 第四趟:1,2,7,8,9

  7. '''

  8. 一趟会得到一个最大值

  9. 时间复杂度:最差的情况:O(n^2) 最好的情况:O(n)



  10. # 1.缺点:如果已经排好序,还会一直循环比较

  11. def bubble_sort(li):

  12. for i in range(len(li)-1):

  13. for j in range(len(li)-1-i):

  14. if li[j] > li[j+1]:

  15. li[j],li[j+1] = li[j+1],li[j]

  16. return li


  17. # 2.改进版,res标示位。

  18. #一趟下来代码没有进入if li[j] > li[j+1],res一直为True,表示已经排好序了,直接跳出循环

  19. def maopao(li):

  20. for i in range(len(li)-1):

  21. res = True

  22. for j in range(len(li)-1-i):

  23. if li[j] > li[j+1]:

  24. li[j],li[j+1] = li[j+1],li[j]

  25. res = False

  26. if res:

  27. return li

快速排序

  1. # 时间复杂度是:O(nlogn)

  2. # 最坏的情况O(n方),刚好是逆序

  3. # 解决方法:每次取第一个p元素,改为随机取

  4. def quick_sort(li, left, right):

  5. if left < right:

  6. mid = partition(li, left, right) # 调归位函数

  7. quick_sort(li, left, mid - 1) # 左边

  8. quick_sort(li, mid + 1, right) # 右边


  9. return li

  10. def partition(li, left, right):

  11. temp = li[left]

  12. while left < right:

  13. while left < right and li[right] >= temp:

  14. right -= 1

  15. li[left] = li[right]

  16. while left < right and li[left] <= temp:

  17. left += 1

  18. li[right] = li[left]


  19. li[left] = temp

  20. return left


  21. # p随机取,降低最坏情况的几率

  22. def partition2(li, left, right):

  23. res = random.randint(left, right)

  24. li[left], li[res] = li[res], li[left]

  25. temp = li[left]

  26. while left < right:

  27. while left < right and li[right] >= temp:

  28. right -= 1

  29. li[left] = li[right]

  30. while left < right and li[left] <= temp:

  31. left += 1

  32. li[right] = li[left]

  33. li[left] = temp

  34. return left


  35. if __name__ == '__main__':

  36. li = [1, 3, 4, 6, 73, 45, 6, 89, 123, 987]

  37. left = 0

  38. right = len(li) - 1

  39. print(quick_sort(li, left, right))

选择排序

  1. 思路:

  2. 一趟遍历记录最小的数,放到第一个位置;

  3. 再一趟遍历记录剩余列表中最小的数,继续放置

  1. # 时间复杂度是:O(n^2)

  2. def select_sort(li):

  3. for i in range(len(li)):

  4. min_loc = i

  5. for j in range(i+1,len(li)):

  6. if li[j]<li[min_loc]:

  7. min_loc = j

  8. if min_loc !=i:

  9. li[i],li[min_loc] = li[min_loc],li[i]

  10. return li

  11. print(select_sort(li))

插入排序

  1. # 时间复杂度:O(n2)

  2. def insert_sort(li):

  3. for i in range(1,len(li)):

  4. tmp = li[i]

  5. j = i-1


  6. while j>=0 and li[j]>tmp:

  7. li[j+1] = li[j]

  8. j = j-1

  9. li[j+1] = tmp

  10. return li

  11. li = [5, 1, 23, 45, 6]

希尔排序

  1. 希尔排序是一种分组插入排序算法。

  2. 首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;

  3. 取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。

  4. # 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。

  1. def shell_sort(li):

  2. res = len(li) // 2

  3. while res > 0:

  4. for i in range(res, len(li)):

  5. tmp = li[i]

  6. j = i - res

  7. while j >= 0 and tmp < li[j]:

  8. li[j + res] = li[j]

  9. j -= res

  10. li[j + res] = tmp

  11. res /= 2

  12. return li


  13. li = [1,2,3,8,9,2,3,2]

  14. print(shell_sort(li))

二分法查找

  1. # 前提列表必须有序


  2. def bin_search(li, value, left, right):

  3. if left <= right:

  4. mid = (left + right) // 2


  5. if li[mid] == value:

  6. return mid

  7. elif li[mid] > value:

  8. return bin_search(li, value, left, mid - 1)

  9. else:

  10. return bin_search(li, value, mid + 1, right)

  11. else:

  12. return



  13. li = [1, 2, 3, 4, 5, 6, 7, 8]

  14. print(bin_search(li, 8, 0, len(li) - 1))


文章转载自Jeff的技术栈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论