CK013[分治]-递归-快速排序

代码骑士
优质创作者: 游戏开发技术领域
2023-01-13 13:49:14

一、问题描述

 

二、问题分析

 

三、算法设计

int Partition(int a[],int low,int high){//划分函数 
	int i=low,j=high,pivot=a[low];//取数组首元素为基准元素
	while(i<j){//当i>=j时不再划分 
		while(i<j&&a[j]>pivot)	j--;//向左扫描
		//扫描停止条件i>j或者a[j]大于基准数 
		if(i<j){//如果a[j]<pivot
			swap(a[i],a[j]);//交换a[i]和a[j]保证pivot右边元素永远比左边大 
			i++;//交换完,i向后移动 
		}
		while(i<j&&a[i]<pivot)	i++;//向右扫描,如果a[i]>pivot跳出循环
		if(i<j){//如果a[i]>pivot
			swap(a[i],a[j]);//交换a[i]和a[j]保证pivot左边元素永远比右边小 
			j--;//交换完,j向前移动  
		}
	}
	return i;//返回最终划分完成后基准元素所在的位置(i=j) 
}

 

void quickSort(int a[],int low,int high){
	int mid;
	if(low<high){
		mid=Partition(a,low,high);//返回基准元素位置
		quickSort(a,low,mid-1);//左区间递归快速排序
		quickSort(a,mid+1,high);//右区间递归快速排序
	}
}

 

四、完整代码

#include<iostream>
using namespace std;

int Partition(int a[],int low,int high){//划分函数 
	int i=low,j=high,pivot=a[low];//取数组首元素为基准元素
	while(i<j){//当i>=j时不再划分 
		while(i<j&&a[j]>pivot)	j--;//向左扫描
		//扫描停止条件i>j或者a[j]大于基准数 
		if(i<j){//如果a[j]<pivot
			swap(a[i],a[j]);//交换a[i]和a[j]保证pivot右边元素永远比左边大 
			i++;//交换完,i向后移动 
		}
		while(i<j&&a[i]<pivot)	i++;//向右扫描,如果a[i]>pivot跳出循环
		if(i<j){//如果a[i]>pivot
			swap(a[i],a[j]);//交换a[i]和a[j]保证pivot左边元素永远比右边小 
			j--;//交换完,j向前移动  
		}
	}
	return i;//返回最终划分完成后基准元素所在的位置(i=j) 
}

void quickSort(int a[],int low,int high){
	int mid;
	if(low<high){
		mid=Partition(a,low,high);//返回基准元素位置
		quickSort(a,low,mid-1);//左区间递归快速排序
		quickSort(a,mid+1,high);//右区间递归快速排序
	}
}

int main(){
	int n;
	int *a=new int[n];
	cout<<"请输入元素个数:"<<endl;
	cin>>n;
	cout<<"请输入各元素值:"<<endl;
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	//分治算法
	quickSort(a,0,n-1);
	cout<<"输出排序结果为:"<<endl;
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	} 
	return 0;
}

输出样例:

 

 

 

...全文
46 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5

社区成员

发帖
与我相关
我的任务
社区描述
考研408:数据结构、计算机组成原理、操作系统、计算机网络
学习方法考研面试 其他
社区管理员
  • 代码骑士
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧