[关闭]
@spiritnotes 2016-02-14T07:39:16.000000Z 字数 1760 阅读 1363

快速排序算法实现

算法


说明

快速排序是一种基于分治思想的排序方法,其按照一个基准数将所有数分成小于基准数和大于等于基准数两组,然后递归在两组内再次排序。

Python实现

  1. import random
  2. import unittest
  3. def quick_sort(array, begin, end):
  4. """快排具体实现用作递归操作"""
  5. if end-begin < 2:
  6. return
  7. #随机选择一个数作为排序基准,放到第一个位置上
  8. base_index = random.randint(begin, end-1)
  9. base_num = array[base_index]
  10. array[begin], array[base_index] = array[base_index] , array[begin]
  11. #当循环结束时,big_index左侧为小于基准值的值,其右边为大于等于基准值的值
  12. for big_index in range(begin+1, end):
  13. if array[big_index] >= base_num:
  14. for small_index in range(end-1, big_index, -1):
  15. if array[small_index] < base_num:
  16. array[big_index], array[small_index] = array[small_index],array[big_index]
  17. break
  18. else:
  19. break #big_index右侧已经没有小于base_num,直接跳出外层循环
  20. else:
  21. big_index = end #全是小于base_num的情况下
  22. array[big_index-1], array[begin] = array[begin], array[big_index-1]
  23. quick_sort(array, big_index, end)
  24. quick_sort(array, begin, big_index-1)
  25. def sort(array):
  26. '''快排,入参为可变列表'''
  27. quick_sort(array, 0, len(array))
  28. class TestQuickSort(unittest.TestCase):
  29. def quick_sort(self, array):
  30. sort(array)
  31. return array
  32. def test_quick_sort(self):
  33. self.assertEqual(self.quick_sort([]),[])
  34. self.assertEqual(self.quick_sort([1]),[1])
  35. self.assertEqual(self.quick_sort([2,2]),[2,2])
  36. self.assertEqual(self.quick_sort([3,2,1]),[1,2,3])
  37. self.assertEqual(self.quick_sort([3,2,1,4,3,4,2,2]),[1,2,2,2,3,3,4,4])
  38. if __name__ == '__main__':
  39. unittest.main()

非稳定

由于在进行排序的时候有随机选择以及交换,其排序不是稳定的,通过如下代码可以测试。

  1. class TestQuickSort(unittest.TestCase):
  2. class ForStableTest():
  3. def __init__(self, i, j):
  4. self.i, self.j = i, j
  5. def __eq__(self, other):
  6. return self.i == other.i and self.j == other.j
  7. def __ge__(self, other):
  8. return self.i >= other.i
  9. def __lt__(self, other):
  10. return self.i < other.i
  11. def __repr__(self):
  12. return '({},{})'.format(self.i,self.j)
  13. def test__qucik_sort_stable(self):
  14. list_ = []
  15. for i in range(1,100):
  16. list_.append(TestQuickSort.ForStableTest(1, i))
  17. origin = list_.copy()
  18. self.assertNotEqual(self.quick_sort(list_),origin)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注