【数据结构-排序】快速排序的非递归算法
参考此文章:《非递归算法——快速排序、归并排序》
算法原理图:
算法代码:
#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;
}