按下述原则编写快排的非递归算法: (1)一趟排序之后,先对长度较短的的子序列进行排序,且将另一子序列的上、下界人 的期 栈保存; (2)若待排记录数<3,则不再进行 分割,而是直接进行比较排序。
时间: 2024-02-16 21:00:21 浏览: 63
首先需要定义一个栈来保存子序列的上、下界,我们可以使用数组来实现。然后按照快排的思想,选择一个枢轴元素,将序列分为左右两个子序列。接着将右子序列的上下界入栈,再对左子序列进行同样的操作。
具体的非递归实现步骤如下:
1. 定义一个栈stack,用来保存子序列的上下界。将整个序列的上下界入栈。
2. 当栈不为空时,取出栈顶的上下界,对该子序列进行快排。
3. 如果子序列中待排记录数小于3,则对该子序列进行直接插入排序。
4. 否则,选择一个枢轴元素,将序列分为左右两个子序列。将右子序列的上下界入栈,对左子序列进行同样的操作。
以下是具体的代码实现:
```
void QuickSortNonRecursive(int* arr, int length)
{
// 定义一个栈,用来保存子序列的上下界
int stack[MAX_SIZE][2];
int top = -1;
// 将整个序列的上下界入栈
stack[++top][0] = 0;
stack[top][1] = length - 1;
while (top >= 0)
{
int left = stack[top][0];
int right = stack[top--][1];
// 如果子序列中待排记录数小于3,则对该子序列进行直接插入排序
if (right - left + 1 < 3)
{
InsertSort(arr + left, right - left + 1);
continue;
}
// 选择一个枢轴元素
int pivot = arr[left];
int i = left, j = right;
// 将序列分为左右两个子序列
while (i < j)
{
while (i < j && arr[j] >= pivot)
j--;
if (i < j)
arr[i++] = arr[j];
while (i < j && arr[i] < pivot)
i++;
if (i < j)
arr[j--] = arr[i];
}
arr[i] = pivot;
// 将右子序列的上下界入栈
stack[++top][0] = i + 1;
stack[top][1] = right;
// 对左子序列进行同样的操作
stack[++top][0] = left;
stack[top][1] = i - 1;
}
}
```
阅读全文