本文详细的介绍了以下两种选择排序:
- 简单选择排序
- 堆排序
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;
}