排序1(归并、快排、选择)

    技术2022-07-17  91

    直接进入正题

    1.归并排序

    归并排序将待排序数组不断地从中间分开直到值剩下两个数再合成左右两个数组,然后比较两个数组位置上的大小,较小的加到一个空数组里面。

    def merge_sort(nums): if len(nums)<2: return mid = len(nums) //2 left = merge_sort(nums[:mid]) right = merge_sort(nums[mid:]) return merge(left,right) def merge(left,right): ans = [] i = 0 j = 0 while i < len(left) and j < len(right): if left[i] <= right[i]: ans.append(left[i]) i += 1 else: ans.append(right[j]) j += 1 ans += left[i:] ans += right[j:] return ans

    2.快速排序 快速排序通过确定一个基准值,大于基准值的放右边,小于的放左边。对两个新数组重复操作直到数组仅有2个或更少元素。

    def quick_sort(nums): if len(nums) < 2: return nums mid = nums[0] left = [] right = [] for i in nums[1:]: if i <= mid: left.append(i) else: right.append(i) return quick_sort(left) + [mid]+quick_sort(right)

    虽然说基准值使用数组中间位置的数比较容易理解,但是在测试(10个数)的时候发现每次“len(nums)//2"都会浪费一点时间,在len(nums)<2这里超过了最大递归深度,递归深度加到1000000之后出现了栈溢出。 3.选择排序 选择排序是在未排序序列中找到最大或最小的元素,存放到前一个最大或最小元素的后面。

    def select_sort(nums): arr = [] for i in range(len(nums)): small = min(nums) arr.append(nums.pop(nums.index(small))) return arr def findMix(nums): s = nums[0] s_index = 0 for i in range(len(nums)): if nums[i]<s: s = nums[i] s_index = i return s_index def select_sort(nums): arr = [] for i in range(len(nums)): small = findMix(nums) arr.append(nums.pop(small)) return arr
    Processed: 0.016, SQL: 9