//选择排序(简单选择排序、堆排序)
#include<stdio.h>
#include<stdlib.h>
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++){//共i-1趟
int min=i;
for(int j=i+1;j<n;j++){
if(A[min]>A[j]){
min=j;
}
}
if(min!=i){
swap(A[i],A[min]);
}
printf("简单选择排序第%d趟结果:",i+1);
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
}
//堆排序有关:
void HeadAdjust(int A[],int k,int len){
//将元素k为跟的子树进行调整
int i;
A[0]=A[k]; //用A[0]暂存根节点
for(i=2*k;i<=len;i*=2){
if(i<len&&A[i]<A[i+1]){ //i<len 保证此结点有右兄弟
i++;
}
if(A[0]<A[i]){
A[k]=A[i];
k=i; //继续下沉
}
}
A[i]=A[0];
}
void BuildMaxHeap(int A[],int len){ //建立大根堆
for(int i=len/2;i>0;i--){ //从len/2往前,将所有分支结点都调整为大根堆 A[len/2]为最后一个非叶子结点
//注:A[0]不存放数据,A的数据下标为1~len
HeadAdjust(A,i,len);
}
}
void HeapSort(int A[],int len){
int i;
BuildMaxHeap(A,len); //建立大根堆
//思想:因为根为最大的,所以每次让根和最后一位换位置,然后将新根进行下沉(因此每轮能确定一个最大的)
for(i=len;i>1;i--){
swap(A[i],A[1]);
HeadAdjust(A,1,i-1); //将剩余的i-1个元素重新整理为大根堆
}
}
int main(){
int A[]={99,1,5,4,6,7,12};
int n=sizeof(A)/sizeof(A[0]);
SelectSort(A,n);
int B[]={0,99,1,5,4,6,7,12};
HeapSort(B,7);
return 0;
}
数据结构——选择排序之简单选择排序、堆排序
最新推荐文章于 2022-11-04 11:18:39 发布