G
N
I
D
A
O
L

【数据结构-排序】快速排序的非递归算法

参考此文章:《非递归算法——快速排序、归并排序》

算法原理图:
image

算法代码:

#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;
}

posted @ 2023-02-26 12:20  漫舞八月(Mount256)  阅读(67)  评论(0编辑  收藏  举报