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

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算法 选择排序算法 -- 选择排序算法的非递归和递归形式实现

数据结构排序

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现

数据结构快速排序非递归实现

Java算法 直接插入排序 -- 直接插入排序算法的非递归和递归形式实现

排序算法杂谈 —— 关于快速排序的优化策略分析