首页 > 编程语言 >【数据结构-排序】快速排序的非递归算法

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

时间:2023-02-26 12:33:56浏览次数:40  
标签:tmp 数据结构 indexStack 递归 int high low 排序 keyIndex

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

算法原理图:
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;
}

标签:tmp,数据结构,indexStack,递归,int,high,low,排序,keyIndex
From: https://www.cnblogs.com/Mount256/p/17156465.html

相关文章

  • 在排序数组中查找元素的第一个和最后一个位置---二分查找
    在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果......
  • 搜索旋转排序数组---二分查找
    搜索旋转排序数组整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k]......
  • 数据结构:树状数组
    声明:全部代码未经编译,不保证正确性,仅限逻辑学习,请勿直接抄袭什么是树状数组树状数组,本质是运用二进制运算规则维护区间。它的效率高于线段树,空间也少于线段树。但是所能......
  • 算法基础1.1.2归并排序
    前言归并排序的思路其实和快速排序的很像,都有递归的过程。但是区别是:快速排序是先处理好这一层,然后再进行传递,在传递到底后,其实排序就已经完成了。而归并排序是先直接一......
  • 2022-2023-2 20221320 数据结构第一周学习总结
    一、教材学习内容总结:1.周一的课上复习了冯·诺依曼模型:输入设备,输出设备(IO设备),存储器,运算器,控制器(CPU)。计算机由硬件(裸机)和软件(系统软件与应用软件)组成(软件是程序、数......
  • 数据结构进阶
    并查集并查集,是一种树形数据结构,用于维护不相交的集合。基本原理每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储了它的父节点。模板题(AcWing.836......
  • 数据结构、算法基本概念
    一、数据数据(Data)是信息的载体,它能够被计算机识别、存储和加工处理。它是计算机程序加工的原料,应用程序处理各种各样的数据。计算机科学中,所谓数据就是计算机加工处理的......
  • 基本排序算法的C语言实现
    为了复习DS临时起意,大概率会咕咕咕...目录插入排序快速排序归并排序堆排序插入排序voidinsertion_sort(intp[],intn){for(inti=2;i<=n;i++){......
  • 【LeetCode二叉树#06】获取二叉树的所有路径(分析递归中的回溯机制)
    二叉树所有路径力扣题目链接(opensnewwindow)给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:思路根据题意,每次遍......
  • QT多线程实现冒泡排序和快速排序方法一
    qt4的线程方式#include"mythread.h"#include<QElapsedTimer>#include<QDebug>Generate::Generate(QObject*parent):QThread(parent){}voidGenerate::recvNum(intnum......