洛谷p5718 复习下快速排序和堆排序

我们之前通过三个数排序复习了些简单的排序算法,刚好这个题给的数据范围比较大因此我们可以借由他复习下堆排序和快速排序。

快速排序

核心思想就是递归,在每层函数中我们都会确定一个数最终在数组中的位置。此时这个数的左边和右边是还没处理过的,因此可以分别继续调用快速排序。那每一层里怎么确定最终的排序位置呢?我们可以先确定一个枢轴元素pivot,想要确定pivot的位置就需要让他右边的数都比他大,因此我们先让右边的high指针往左移,找到一个比pivot小的后我们就让他和low指针所指的数换位置;处理完后我们同样让low往右移动,找到比pivot大的我们就让他和high指针所指的数换位置。最终代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

//申明函数 
void quick(int nums[],int n);
void quick_sort(int nums[],int low,int high);
int partition(int nums[],int low,int high);

void quick(int nums[],int n){
	//入口函数 
	quick_sort(nums,0,n-1);
}

void quick_sort(int nums[],int low,int high){
	//提前写好递归终止条件,即low<high时才进行 
	if(low<high){	
	int pos = partition(nums,low,high);//找到pivot的下标 
	quick_sort(nums,low,pos-1);
	quick_sort(nums,pos+1,high);
	} 
}

int partition(int nums[],int low,int high){
	int pivot = nums[low];
	while(low<high){
		while(low<high&&nums[high]>=pivot) high--;
		swap(nums[low],nums[high]);
		while(low<high&&nums[low]<=pivot) low++;
		swap(nums[low],nums[high]);
	}
	return low;
}

int main(){
	int n;
	cin>>n;
	int a[104];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	
	quick(a,n);
	cout<<a[0];
	
	
}

堆排序

堆排序比其他排序要稍微麻烦一点的就是我们需要初始建堆后才开始进行排序。但初始建堆其实并不复杂,所谓建堆其实就是让一堆数的排列满足堆的要求,这里我们以小顶堆为例:我们要求父节点一定都要比任何一个子节点小,因此我们需要检查子节点的值若出现更小的就要交换,但问题是交换了后子树有可能不满足性质,因此这时候我们需要继续递归处理子树。这一步叫做维护堆的性质,接下来我们只需要依次对非叶子节点进行维护即可建堆。根据树的性质我们可以知道最后一个非叶子节点就是n/2-1。当我们建堆后下一步就是排序,我们每轮只要将根节点(要么最大要么最小)换到数组末尾,随后对剩下的树维护堆的性质即可(换到最后的那个就不用管他了)。因此代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void heapify(int nums[],int n,int i){
	//n是数组长度,i是当前待维护节点
	int minist = i; //这里我写的小顶堆
	int lson = i*2+1;
	int rson = i*2+2;
	if(lson<n&&nums[lson]<nums[minist]){
	  minist=lson;
	}
	if(rson<n&&nums[rson]<nums[minist]){
		minist=rson;
	}
	if(minist != i){
		swap(nums[minist],nums[i]);
		heapify(nums,n,minist);
	}
}

void heap_sort(int nums[],int n){
	for(int i=n/2-1;i>=0;i--){
		heapify(nums,n,i);
	}//建堆 
	for(int i=n-1;i>0;i--){
		swap(nums[0],nums[i]);
		heapify(nums,i,0);
	}
}

int main(){
	int n;
	cin>>n;
	int a[104];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	
	heap_sort(a,n);
	cout<<a[n-1];
	
	
}
相关推荐
大鱼>40 分钟前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC1 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC1 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师2 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水2 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25012 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
阳明山水3 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾3 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
AI科技星3 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
大鱼>4 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物