算法学习之选择排序和堆排序:

算法学习之选择排序和堆排序:

1.选择排序:

(1)思想:在每一趟待排序元素中选取关键字最小的元素加入有序子序列中。

(2)性能分析:空间复杂度O(1) 时间复杂度O(n^2)

(3) 稳定性:不稳定 ,适用于顺序表,链表。

(4)算法实现:

void SelectSort(int A[],int n){
for(int i=0;i<n-1;i++){
        int min=i;
    for(int j=i+1;j<n;j++)
        if(A[j]<A[min])
            min=j;
if(min!=i)
    swap(A[i],a[min]);
}
}
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void SelectSort(int A[],int n);
int main(){
	int A[MAX];
	int i,n;
	printf("请输入待排数的个数:\n");
	scanf("%d",&n);
	printf("请输入待排数:\n");
	for(i=0;i<n;i++)
	scanf("%d",&A[i]);
	SelectSort(A,n);
	printf("排序结果为: \n");
    Printfarry(A,n);
    return 0;
} 
void swap(int *a,int *b){
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;

} 
void Printfarry(int A[],int n){
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\n",A[i]);
	}
	return;
	 } 
void SelectSort(int A[],int n){
int i,j;
for( i=0;i<n-1;i++){
        int min=i;
    for(j=i+1;j<n;j++)
        if(A[j]<A[min])
            min=j;
if(min!=i)
    swap(&A[i],&A[min]);
}
}

在这里插入图片描述

2.堆排序:

(1)算法思想:

建堆:编号<=n/2的所有节点依次做下坠调整(自底向上处理各分支节点),小元素逐层下坠(与关键字更大的孩子交换)

排序:将堆顶的元素加入有序子序列(堆顶元素与堆底元素交换),堆底元素换到堆顶后,需要进行下坠调整,恢复大根堆的特性,重复上述过程n-1趟。

(2)算法性能:

空间复杂度:O(1) 时间复杂度O(n*logn)

(3)稳定性:不稳定

(4)算法实现:

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void HeapSort(int A[],int len);
void HeadAdjust(int A[],int k,int len);
int main(){
	int A[MAX];
	int i,k,len;
	printf("请输入结点个数:\n");
	scanf("%d",&len);
	printf("请输入数据:\n");
	for(i=0;i<len;i++)
		scanf("%d",&A[i]);
	HeapSort(A,len);
	printf("堆排序的结果为:\n");
	Printfarry(A,len);
	return 0;
	
} 
void HeadAdjust(int A[],int k,int len){
	int q,temp;
	temp=A[k];
	while((q=2*k+1)<len){
		if(q<len-1&&A[q]<A[q+1])
		q++;
		if(temp<A[q])
		{
			A[(q-1)/2]=A[q];
			k=q;
		}
		else
		break;
	}
	A[(q-1)/2]=temp;
	
}
void HeapSort(int A[],int len){
	int i,k,temp;
	i=(len-1)/2;
	while(i>=0){
		HeadAdjust(A,i,len);
		i--;
	}
	i=len-1;
	while(i>0){
		temp=A[0];
		A[0]=A[i];
		A[i]=temp;
		HeadAdjust(A,0,i);
		i--;
	}
}
void Printfarry(int A[],int n){
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\n",A[i]);
	}
	return;
	 } 

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值