数据结构-排序快速排序的非递归算法
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-排序快速排序的非递归算法相关的知识,希望对你有一定的参考价值。
参考此文章:《非递归算法——快速排序、归并排序》
算法原理图:
算法代码:
#include <stdio.h>
#include <stack>
using namespace std;
// 记录区间左右两端索引值
typedef struct
int low;
int high;
indexStruct;
// 交换两数
void swap (int &a, int &b)
int tmp = a;
a = b;
b = tmp;
// 快速排序-单趟排序
int QSortSingle (int A[], int low, int high)
int i = low, j = high; // 左右指针分别指向区间两端
int pivot; // 基准值
//将 A 数组中随机一个元素和 A[low] 交换; // 随机选取基准值
pivot = A[low]; // 最左边作为基准值
while (i != j)
while ((i < j) && (A[j] > pivot)) // 右指针从区间右端往左端移动
j--;
while ((i < j) && (A[i] <= pivot)) // 左指针从区间左端往右端移动(注意还有等于条件)
i++;
if (i < j)
swap(A[i], A[j]); // 交换 A[i] 和 A[j]
swap(A[low], A[i]); // 将基准值放入最终位置
return i;
// 快速排序-非递归算法
void QSortNR (int A[], int length)
stack<indexStruct> indexStack;
indexStruct tmp;
int keyIndex;
// 区间[0, n-1]入栈
tmp.low = 0;
tmp.high = length - 1;
indexStack.push(tmp);
while (!indexStack.empty())
// 将原区间[low, high]记录下来
int low_t = tmp.low;
int high_t = tmp.high;
// 新区间出栈
tmp = indexStack.top();
indexStack.pop();
// 对新区间进行单趟排序,得到中间的索引值
keyIndex = QSortSingle(A, tmp.low, tmp.high);
// 区间[low, keyIndex - 1]入栈
if (low_t < keyIndex - 1)
tmp.low = low_t;
tmp.high = keyIndex - 1;
indexStack.push(tmp);
// 区间[keyIndex + 1, high]入栈
if (keyIndex + 1 < high_t)
tmp.low = keyIndex + 1;
tmp.high = high_t;
indexStack.push(tmp);
int main()
int n;
int a[100] = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
printf("\\n");
QSortNR(a, n);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
以上是关于数据结构-排序快速排序的非递归算法的主要内容,如果未能解决你的问题,请参考以下文章
Java算法 选择排序算法 -- 选择排序算法的非递归和递归形式实现
[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现