当前位置:   article > 正文

python 实现排序方法,常见排序方法,快速排序,归并排序,谢尔排序,堆排序,冒泡排序,选择排序,插入排序_python堆排序vs归并vs快速排序

python堆排序vs归并vs快速排序

一、冒泡排序:

nums = [1,3,2,5,4,9,6]

  1. def bubbleSort(alist):
  2. n = len(alist)
  3. for passnum in range(n-1,-1,-1):
  4. for i in range(passnum):
  5. if alist[i] > alist[i+1]:
  6. alist[i],alist[i+1] = alist[i+1],alist[i]
  7. return alist
  8. print(bubbleSort(nums))

改进:提前排好序就停止

  1. def shortBubbleSort(alist):
  2. n = len(alist)
  3. right = n-1
  4. exchange = True
  5. while right < 0 and exchange:
  6. flag = False
  7. for i in range(right):
  8. if alist[i+1] < alist[i]:
  9. flag = True
  10. alist[i],alist[i+1] = alist[i+1],alist[i]
  11. right -= 1
  12. return alist
  13. print(shortBubbleSort(nums))

 二、选择排序:

  1. def selectionSort(alist):
  2. for i in range(len(alist)-1,0,-1):
  3. pos = 0
  4. for j in range(1,i+1):
  5. if alist[pos] < alist[j]:
  6. pos = j
  7. alist[pos],alist[i] = alist[i],alist[pos]
  8. return alist
  9. print(selectionSort(nums))

三、插入排序:

  1. def insertionSort(alist):
  2. for index in range(1,len(alist)):
  3. currentvalue = alist[index]
  4. pos = index
  5. while pos > 0 and alist[pos-1] > alist[pos]:
  6. alist[pos] = alist[pos-1]
  7. pos -= 1
  8. alist[pos] = currentvalue
  9. return alist
  10. print(insertionSort(nums))

四、希尔排序

  1. # -------------------------------------------------------------------------------
  2. # coding:utf-8
  3. # Description:
  4. # Reference:
  5. # Author: dacongming
  6. # Date: 2023/7/10
  7. # -------------------------------------------------------------------------------
  8. def shell_sort(arr):
  9. n = len(arr)
  10. gap = n // 2
  11. while gap > 0:
  12. for i in range(gap,n):
  13. temp = arr[i]
  14. j = i
  15. while j >= gap and arr[j - gap] > temp:
  16. arr[j] = arr[j - gap]
  17. j -= gap
  18. arr[j] = temp
  19. gap //= 2
  20. return arr
  21. arr = [9, 2, 5, 1, 6, 4, 8, 3, 7]
  22. sorted_arr = shell_sort(arr)
  23. print(sorted_arr) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

以上代码中,shell_sort函数接收一个列表作为参数,使用希尔排序算法对列表进行排序。首先设置一个初始的间隔大小gap,初始值为列表长度的一半。然后不断将间隔大小减半,直到间隔大小为1。在每个间隔大小下,对列表中每个间隔位置的元素进行插入排序

插入排序的思想是将当前元素插入到已排序的序列中的正确位置。在希尔排序中,通过设置不同的间隔,可以使得列表中的元素跳跃式地移动,从而加快排序的速度。最后,希尔排序会在间隔大小为1时完成最后一次排序,得到最终的有序列表。

五、归并排序

  1. # coding:utf-8
  2. # Description:
  3. # Reference:
  4. # Author: dacongming
  5. # Date: 2023/7/10
  6. # -------------------------------------------------------------------------------
  7. def merge_sort(arr):
  8. if len(arr) <= 1:
  9. return arr
  10. mid = len(arr) // 2
  11. left = arr[:mid]
  12. right = arr[mid:]
  13. left = merge_sort(left)
  14. right = merge_sort(right)
  15. return merge(left,right)
  16. def merge(left, right):
  17. result = []
  18. i = j = 0
  19. while i < len(left) and j < len(right):
  20. if left[i] <= right[j]:
  21. result.append(left[i])
  22. i += 1
  23. else:
  24. result.append(right[j])
  25. j += 1
  26. result.extend(left[i:])
  27. result.extend(right[j:])
  28. return result
  29. arr = [9, 2, 5, 1, 6, 4, 8, 3, 7]
  30. sorted_arr = merge_sort(arr)
  31. print(sorted_arr) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

以上代码中,merge_sort函数接收一个列表作为参数,使用递归的方式进行归并排序。首先将列表分成左右两部分,然后递归调用merge_sort函数对左右两部分进行排序。然后调用merge函数将排序好的左右两部分合并成一个有序的列表并返回。

merge函数接收两个有序的列表作为参数,通过比较左右两个列表的元素大小,逐个选择较小的元素放入结果列表中。最后将剩余的元素追加到结果列表中并返回。

六、快速排序

  1. # -------------------------------------------------------------------------------
  2. # coding:utf-8
  3. # Description:
  4. # Reference:
  5. # Author: dacongming
  6. # Date: 2023/7/10
  7. # -------------------------------------------------------------------------------
  8. def quick_sort(arr):
  9. if len(arr) <= 1:
  10. return arr
  11. else:
  12. pivot = arr[0]
  13. less = [x for x in arr[1:] if x <= pivot]
  14. greater = [x for x in arr[1:] if x > pivot]
  15. return quick_sort(less) + [pivot] + quick_sort(greater)
  16. arr = [9, 2, 5, 1, 6, 4, 8, 3, 7]
  17. sorted_arr = quick_sort(arr)
  18. print(sorted_arr) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

 以上代码中,quick_sort函数接收一个列表作为参数,使用快速排序算法对列表进行排序。快速排序的基本思想是通过选择一个基准元素(通常是列表的第一个元素),将列表分割成两个子列表,其中一个子列表的元素都小于等于基准元素,另一个子列表的元素都大于基准元素。然后递归地对两个子列表进行快速排序,最后将两个子列表和基准元素合并起来。

在代码中,首先判断列表的长度。如果列表长度小于等于1,则直接返回该列表。否则,选择列表的第一个元素作为基准元素pivot。然后使用列表推导式分别生成两个子列表lessgreater,其中less包含小于等于基准元素的元素,greater包含大于基准元素的元素。最后,递归地对两个子列表进行快速排序,并将排序结果与基准元素合并起来。

七:堆排序

  1. # -------------------------------------------------------------------------------
  2. # coding:utf-8
  3. # Description:
  4. # Reference:
  5. # Author: dacongming
  6. # Date: 2023/7/10
  7. # -------------------------------------------------------------------------------
  8. def heapify(arr, n, i):
  9. largest = i
  10. left = 2 * i + 1
  11. right = 2 * i + 2
  12. if left < n and arr[i] < arr[left]:
  13. largest = left
  14. if right < n and arr[largest] < arr[right]:
  15. largest = right
  16. if largest != i:
  17. arr[i], arr[largest] = arr[largest], arr[i]
  18. heapify(arr, n, largest)
  19. def heap_sort(arr):
  20. n = len(arr)
  21. for i in range(n, -1, -1):
  22. heapify(arr, n, i)
  23. for i in range(n - 1, 0, -1):
  24. arr[i], arr[0] = arr[0], arr[i]
  25. heapify(arr, i, 0)
  26. return arr
  27. arr = [9, 2, 5, 1, 6, 4, 8, 3, 7]
  28. sorted_arr = heap_sort(arr)
  29. print(sorted_arr) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

以上代码中,heapify函数用于将一个数组中的元素调整为最大堆的形式。该函数接收三个参数:数组arr、数组的长度n和当前要调整的元素下标i。首先,将当前元素下标i设为最大元素下标largest,然后分别计算左子节点和右子节点的下标。如果左子节点存在并且大于当前元素,则将左子节点的下标设为最大元素下标largest;如果右子节点存在并且大于当前元素,则将右子节点的下标设为最大元素下标largest。如果最大元素下标largest不等于当前元素下标i,则交换当前元素和最大元素,然后递归地对最大元素所在的子树进行堆化。

heap_sort函数用于对数组进行堆排序。该函数接收一个数组arr作为参数。首先,对数组进行初始化堆化,即从最后一个非叶子节点开始,依次对每个非叶子节点进行堆化。然后,依次将堆顶元素(最大元素)与最后一个元素交换,并将数组长度减一,再对堆顶元素进行堆化。重复这个过程,直到数组被完全排序。最后返回排序后的数组

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/407414
推荐阅读
相关标签
  

闽ICP备14008679号