class Solution: def partition(self, nums, left, right): # 选择pivot是一个比较关键的点,影响最好最快的复杂度 if nums[left] < nums[right]: self.swap(nums, left, left+(right-left)//2) pivot = left index = left+1 for i in range(index, right+1): # 同样的,升序或降序只需要修改下面的比较符号即可 if nums[i] < nums[pivot]: self.swap(nums, i, index) index += 1 self.swap(nums, index-1, pivot) returnindex-1
class Solution: def partition(self, nums, left, right): if nums[left] < nums[right]: self.swap(nums, left, left+(right-left)//2) pivot = left index = left+1 for i in range(index, right+1): if nums[i] < nums[pivot]: self.swap(nums, i, index) index += 1 self.swap(nums, index-1, pivot) returnindex-1
def swap(self, nums, left, right): nums[left], nums[right] = nums[right], nums[left] def quickSort(self, nums, left, right): ifleft < right: stack = [right, left] while stack: i = stack.pop() j = stack.pop() pivot_index = self.partition(nums, i, j) if i < pivot_index: stack.append(pivot_index-1) stack.append(i) if pivot_index < j: stack.append(j) stack.append(pivot_index+1) return nums
// 递归版本 voidquickSort(vector<int>& nums, int left, int right){ if (left < right){ int pivot = partition(nums, left, right); quickSort(nums, left, pivot-1); quickSort(nums, pivot+1, right); } }
// 非递归版本 voidquickSort2(vector<int>& nums, int left, int right){ if (left < right){ stack<int> s; s.push(right); s.push(left); while (!s.empty()){ int l = s.top(); s.pop(); int r = s.top(); s.pop(); int pivot = partition(nums, l, r); // l, pivot-1 // pivot+1, r if (l < pivot-1){ s.push(pivot-1); s.push(l); } if (pivot+1 < r){ s.push(r); s.push(pivot+1); } } } }
//快排的核心函数 intpartition(vector<int>& nums, int left, int right){ int mid = left + (right - left)/2; if (nums[left] < nums[right]){ swap(nums[left], nums[mid]); } int pivot = left; int index = left+1; for (int i = left+1; i <= right; i++){ if (nums[i] < nums[pivot]){ swap(nums[i], nums[index++]); } } swap(nums[index-1], nums[pivot]); return index-1; } };
def merge(self, nums, begin, mid, end): result = [] i, j = begin, mid while i < midand j < end: if nums[i] <= nums[j]: result.append(nums[i]) i += 1 else: result.append(nums[j]) j += 1 result += nums[i:mid] result += nums[j:end] nums[begin:end] = result
defheapSort(self, nums): self.buildHeap(nums) for i inrange(len(nums)-1, -1, -1): self.swap(nums, i, 0) self.adjust(nums, 0, i) return nums defswap(self, nums, i, j): nums[i], nums[j] = nums[j], nums[i]
defbuildHeap(self, nums): for i inrange(len(nums)//2, -1, -1): self.adjust(nums, i, len(nums))
defadjust(self, nums, i, length): temp = nums[i] k = 2*i + 1 while k < length: # 升序和降序修改此处第二个比较符号 if k+1 < length and nums[k+1] > nums[k]: k += 1 # 升序和降序修改此处比较符号 if nums[k] > temp: nums[i] = nums[k] i = k k = 2*k + 1 nums[i] = temp