[关闭]
@WillireamAngel 2018-05-28T07:43:10.000000Z 字数 1920 阅读 904

排序算法

数据结构


冒泡排序

两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

  1. def bubblesort(list):
  2. for iter_num in range(len(list)-1,0,-1):
  3. for idx in range(iter_num):
  4. if list[idx]>list[idx+1]:
  5. temp = list[idx]
  6. list[idx] = list[idx+1]
  7. list[idx+1] = temp
  8. list = [19,2,31,45,6,11,121,27]
  9. bubblesort(list)

简单选择排序

每次从待排序数据元素中选出最小/最大存放在序列的起始位置,知道全部待排序的数据元素排完。

  1. def selectorder(unsortedlist):
  2. for idx in rang(len(unsortedlist)):
  3. min_idx = idx
  4. for j in range(idx+1,len(unsortedlist)):
  5. if unsortedlist[min_idx] > unsortedlist[j]:
  6. min_idx = j
  7. unsortedlist[idx],unsortedlist[min_idx] = unsortedlist[min_idx],unsortedlist[idx]
  8. return unsortedlist

直接插入排序

将一个数据直接插入到已经排好序的序列中。

  1. def insertsort(unsortedlist):
  2. for i in range(1,len(unsortedlist)):
  3. j = i-1
  4. next_element = unsortedlist[i]
  5. while (unsortedlist[j] > nxt_element) and (j >= 0):
  6. unsortedlist[j+1] = unsortedlist[j]
  7. j -= 1
  8. unsortedlist[j+1] = next_element
  9. return unsortedlist

希尔排序

按一定下标的增量分组(每隔一定间隔选取一个数),对每组使用直接插入排序算法排序,随着增量逐渐减少每组包含的关键词越来越少,当增量减到1的时候,算法终止。然后再进行微调即可获得排序序列。
常见增量序列(非最优):{n/2,(n/2)/2...1} n=len(list)

  1. def shellsort(unsortedlist):
  2. gap = len(unsortedlist) //2
  3. while gap >= 1:
  4. for i in range(gap, len(unsortedlist)):
  5. temp = unsortedlist[i]
  6. j = i
  7. while j >= gap and unsortedlist[j-gap] > temp:
  8. unsortedlist[j] = unsortedlist[j-gap]
  9. j = j - gap
  10. unsortedlist[j] = temp
  11. gap = gap // 2
  12. return unsortedlist

堆排序

归并排序

将两个已经排序的序列合并成一个序列。

  1. #import sys
  2. #sys.setrecursionlimit(1000000)
  3. def mergesort(unsortedlist):
  4. if len(unsortedlist) <= 1:
  5. return unsortedlist
  6. middle = len(unsortedlist) // 2
  7. list_left = unsortedlist[:middle]
  8. list_right = unsortedlist[middle:]
  9. list_left = mergesort(list_left)
  10. list_right = mergesort(list_right)
  11. return list(merge(list_left,list_right))
  12. def merge(list_left,list_right):
  13. result = []
  14. while len(list_left) != 0 and len(list_right) !=0:
  15. if list_left[0] < list_right[0]:
  16. result.append(list_left[0])
  17. list_left.remove(list_left[0])
  18. else:
  19. result.append(list_right[0])
  20. list_right.remove(list_right[0])
  21. if len(list_left) == 0:
  22. result += list_right
  23. else:
  24. result += list_left
  25. return result
  26. unsortedlst = [64, 34, 25, 12, 22, 11, 90]
  27. print(mergesort(unsortedlst))

快速排序

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注