10.30❹按下述原则编写快排的非递归算法: (1)一趟排序之后,若子序列已有序(无交换),则不参加排序,否则先对长度较短的子序列进行排序,且将另一子序列的上、下界入栈保存; (2)若待排记录数≤3,则不再进行分割,而是直接进行比较排序。
时间: 2023-12-23 11:05:52 浏览: 113
以下是按照题目要求编写的快排的非递归算法实现:
```python
def quick_sort(arr):
stack = [(0, len(arr) - 1)]
while stack:
left, right = stack.pop()
if right - left <= 2:
for i in range(left, right + 1):
for j in range(i + 1, right + 1):
if arr[j] < arr[i]:
arr[i], arr[j] = arr[j], arr[i]
else:
pivot = partition(arr, left, right)
if left < pivot - 1:
stack.append((left, pivot - 1))
if pivot + 1 < right:
stack.append((pivot + 1, right))
return arr
def partition(arr, left, right):
pivot = arr[left]
while left < right:
while left < right and arr[right] >= pivot:
right -= 1
arr[left] = arr[right]
while left < right and arr[left] <= pivot:
left += 1
arr[right] = arr[left]
arr[left] = pivot
return left
```
该算法使用栈来保存待处理的子序列的上下界,先处理长度较短的子序列,再处理长度较长的子序列,直到所有的子序列都有序为止。如果待排序的序列长度小于等于 3,则直接进行比较排序。该算法的时间复杂度为 O(n log n),空间复杂度为 O(log n)。
阅读全文