这篇文章有的排序算法是:快速排序、希尔排序、归并排序。
快速排序
'''
快速排序
'''def quick_sort(aList, first, last):if first >= last:returnmin_val = aList[first]low_index = firsthight_index = lastwhile low_index < hight_index:# hight 左移动while low_index < hight_index and min_val <= aList[hight_index]:hight_index -= 1aList[low_index] = aList[hight_index]# low 右移动while low_index < hight_index and min_val > aList[low_index]:low_index += 1aList[hight_index] = aList[low_index]aList[low_index] = min_val# 左边quick_sort(aList, first, low_index - 1)# 右边quick_sort(aList, low_index + 1, last)if __name__ == "__main__":li = [54, 26, 93, 17, 77, 31, 44, 55, 20]# li = [26, 93, 54]print(li)quick_sort(li, 0, len(li) - 1)print(li)
快速排序的思路是:
1、从列表中找出一个元素,min_val 作为“基准”元素。
2、然后对列表进行排序,排序的规则是,比min_val基准元素小的放在基准元素的左边,比min_val 基准元素大的放在基准元素的右面。这个时候基准元素就在这个列表的中间的位置。这个称为分区操作。
3、递归进行操作,就是在把基准元素左边的元素当做一个列表重复第2步操作,把基准元素左边的元素当做一个列表重复第2步操作。
归并排序
'''
归并排序
'''def merge_sort(aList):n = len(aList)if n <= 1:return aListmid = n//2left_li = merge_sort(aList[:mid])right_li = merge_sort(aList[mid:])left_pointer, right_pointer = 0, 0result = []while left_pointer < len(left_li) and right_pointer < len(right_li):if left_li[left_pointer] <= right_li[right_pointer]:result.append(left_li[left_pointer])left_pointer += 1else:result.append(right_li[right_pointer])right_pointer += 1result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == "__main__":li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)a = merge_sort(li)print(a)
归并排序的思路是:
1、归并排序的思想就是先递归分解数组,再合并数组。
2、然后将两个列表第一个元素进行比较,将小的数据push到新的列表里面。
希尔排序
'''
希尔排序
'''def shell_sort(aList):n = len(aList)gap = n // 2while gap > 0:for j in range(gap, n):i = jwhile i > 0:if aList[i] < aList[i - gap]:aList[i - gap], aList[i] = aList[i], aList[i - gap]i -= gapelse:breakgap //= 2if __name__ == "__main__":li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)shell_sort(li)print(li)