排序 —— 选择排序(简单选择排序、堆排序)

本文详细的介绍了以下两种选择排序

  1. 简单选择排序
  2. 堆排序

在这里插入图片描述


1.简单选择排序

(1)算法思想
在这里插入图片描述

(2)算法实现

——文末附代码!

在这里插入图片描述

(3)算法性能分析
在这里插入图片描述
在这里插入图片描述


2.堆排序

在这里插入图片描述

(1)堆的概念(大根堆、小根堆)

  • 大根堆
    在这里插入图片描述
  • 小根堆
    在这里插入图片描述

(2)建立大根堆

  • 算法思想
    在这里插入图片描述
  • 实现代码
    在这里插入图片描述

(3)堆排序

——文末附代码!

  • 算法思想
    在这里插入图片描述
  • 代码实现
    在这里插入图片描述

(4)算法效率分析

  • 推导
    在这里插入图片描述
    在这里插入图片描述
  • 结论
    在这里插入图片描述
    在这里插入图片描述

(5)堆的插入与删除
在这里插入图片描述

  • 插入(小根堆为例)
    在这里插入图片描述
    在这里插入图片描述
  • 删除(小根堆为例)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.简单选择排序

#include<bits/stdc++.h>
using namespace std;

//交换元素值 
void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
} 

//选择排序
void SelectSort(int a[],int n){
	
	for(int i=0;i<n-1;i++){
		int t=i;
		for(int j=i+1;j<n;j++){
			if(a[j]<a[t]){
				t=j;
			}
		}
		swap(a[i],a[t]);
	}
} 

//主函数 
int main(){
	
	int a[]={49,38,65,97,76,13,27,49};
	
	int n=sizeof(a)/sizeof(a[0]);
	
	//调用快排
	SelectSort(a,n); 

	//输出快排后序列
	 for(int i=0;i<n;i++){
	 	cout<<a[i]<<" ";
	 } 
	
	return 0;
}

2.堆排序

#include<bits/stdc++.h>
using namespace std;

//交换元素值 
void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
} 

//调整以K为根节点的子树,成为大根堆
void HeadAdjust(int a[],int k,int len) {
	a[0]=a[k];
	for(int i=2*k;i<=len;i*=2){
		if(i<len&&a[i]<a[i+1]){	//i<len:保证其有右子树 
			i++; 
		}
		if(a[0]>a[i]){
			break;
		}else{
			a[k]=a[i];
			k=i;
		}
	}
	a[k]=a[0];
}

//建立大根堆
void BuildMaxHeap(int a[],int len){
	for(int i=len/2;i>=1;i--){
		HeadAdjust(a,i,len);
	}
} 

//堆排序
void HeapSort(int a[],int len){
	BuildMaxHeap(a,len);
	for(int i=len;i>1;i--){
		swap(a[i],a[1]);
		HeadAdjust(a,1,i-1);
	}
} 

//主程序代码 
int main(){
	
	int a[]={0,53,17,78,9,45,65,87,32}; 
	int n=sizeof(a)/sizeof(a[0]);
	int len=n-1;
	
	//堆排序
	HeapSort(a,len-1); 
	
	//输出堆排序后序列
	 for(int i=1;i<=len;i++){
	 	cout<<a[i]<<" ";
	 } 
	
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值