defpartition(start, end, nums): if start >= end: return p = nums[start] left = start right = end while left < right: while nums[right] >= p and left < right: right -= 1 while nums[left] <= p and left < right: left += 1 nums[right], nums[left] = nums[left], nums[right] nums[start], nums[left] = nums[left], nums[start] partition(start, left - 1, nums) partition(left + 1, end, nums) partition(0, len(nums)-1, nums)
defshell_sort(nums): end = len(nums) inc = len(nums) // 2# 步进 while inc > 0: for i inrange(inc, end): # 从inc, inc+1, inc+2遍历 temp = nums[i] j = i - inc while temp < nums[j] and j >= 0: nums[j+inc] = nums[j] j -= inc nums[j+inc] = temp inc //= 2
javascript实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
functionshellSort(nums) { let step = Math.floor(nums.length / 2); let len = nums.length; while (step > 0) { for (let i = step; i < len; i += step) { temp = nums[i]; j = i - step; while (j >= 0 && temp < nums[j]) { nums[j+step] = nums[j]; j -= step; } nums[j+step] = temp; } step = Math.floor(step / 2) } }
冒泡排序
时间复杂度O(n^2),空间复杂度O(1),稳定排序 python实现
1 2 3 4 5 6
defbubble_sort(nums): for i inrange(len(nums)): for j inrange(0, len(nums)-1): # 交互大小相反的元素 if nums[j] > nums[j+1]: nums[j+1], nums[j] = nums[j], nums[j+1]
javascript实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14
functionbubbleSort(nums) { let len = nums.length; let temp; for (let i = 0; i < len; i++) { for (let j = 0; j < len; j++) { if (nums[j] > nums[j+1]) { temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } } }
defmerge(left, mid, right, nums): i = left j = mid+1 temp = [] while i <= mid and j <= right: if nums[i] <= nums[j]: temp.append(nums[i]) i += 1 else: temp.append(nums[j]) j += 1 if i <= mid: temp.extend(nums[i: mid+1]) if j <= right: temp.extend(nums[j: right+1]) nums[left: right+1] = temp
defheapify(nums, start, end): # 构建当前子树为大根堆 parent = start while parent < end: son = parent * 2 + 1 if son > end: return if son < end and nums[son+1] > nums[son]: son += 1 if nums[parent] > nums[son]: return nums[parent], nums[son] = nums[son], nums[parent] parent = son
defheap_sort(nums): parent = len(nums)//2 - 1# 最后一个父节点 end = len(nums) - 1 for i inrange(parent, -1, -1): # 将每个子树都大根化 heapify(nums, i, end) print(nums) for i inrange(len(nums)-1, -1, -1): nums[i], nums[0] = nums[0], nums[i] print(nums) heapify(nums, 0, i-1)
functionheapify(start, end) { let parent = start; let son; while (parent < end) { son = 2 * parent + 1; if (son > end) return; if (son < end && nums[son] < nums[son + 1]) { son += 1 } if (nums[parent] > nums[son]) { return; } let t = nums[parent] nums[parent] = nums[son] nums[son] = t parent = son; } }
let lastParent = Math.floor(nums.length / 2) + 1; for (let i = lastParent; i >= 0; i--) { heapify(i, len - 1); } for (let i = len - 1; i > 0; i--) { let t = nums[0]; nums[0] = nums[i]; nums[i] = t; heapify(0, i - 1); } return nums }
选择排序
时间复杂度O(n^2),空间复杂度O(1),不稳定
每次选择最小的值,放入当前位置。
javascript实现
1 2 3 4 5 6 7 8 9 10 11 12 13
functionselectSort(nums) { let len = nums.length; for (let i = 0; i < len; i++) { let temp = i; for (let j = i+1; j < len; j++) { if (nums[temp] > nums[j]) { temp = j; } } [nums[temp], nums[i]] = [nums[i], nums[temp]] } return nums }