常考的排序算法汇总3:简单选择排序、堆排序

选择排序

1.简单选择排序

1.1算法描述
其基本思想就是:
第一步,在待排序的记录关键字a[1]——a[n]中选择最小(最大)记录,将它与a[1]交换;
第二步,在剩下的a[2]——a[n]中选择最小(最大)的记录,将它与a[2]交换;
第三步:以此类推,即可得出从小至大(从大至小)的数列。
1.2举例理解

初始数列:10 50 30 60 70 20
第一趟:选择数列中最小的数,即10,10在a[1]上,因此不需要交换,即:10 50 30 60 70 20
第二趟:从剩下的数中选择最小的数,即20,将20与a[2]交换,即:10 20 30 60 70 50
以此类推,得出序列为:10 20 30 50 60 70

1.3代码实现

#include <stdio.h>
int SelectSort(int a[],int n)
{
	int i,j,wm,min;
	for(i=0;i<n;i++)
	{
		min=i;
		for(j=i+1;j<n;j++)
		{
			if(a[j]<a[min])
			{
				min=j;
			}
		}
		if(min!=i)
		{
			wm=a[i];
			a[i]=a[min];
			a[min]=wm;
		}
	}
 } 
 int main()
 {
 	int i,a[]={10,50,30,60,70,20};
 	printf("排序前的数列:");
	for(i=0;i<6;i++)
	{
		printf("%d ",a[i]);
	} 
	SelectSort(a,6);
	printf("排序后的数列:");
	for(i=0;i<6;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
 }

2.堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

2.1算法描述
第一步:将无序序列构建成一个堆,自行选择大顶堆或小顶堆;
第二步:将堆顶元素与末尾元素交换,将最大元素放到数组末端;
第三步:重复执行第一、二步,直到整个序列有序。
2.2举例理解
(以大顶堆为例)

设初始无序序列为:2 6 8 3 7 9 5
对应的堆为:
2
6 8
3 7 9 5

构造大顶堆为:

9
7 8
3 6 2 5
即现在序列为:9 7 8 3 6 2 5
将堆顶元素与末尾元素交换,使末尾元素最大,则序列为:5 7 8 3 6 2 9(此时9为确定序列,此后只对剩下元素排序)

重新调整结构为:

8
7 5
3 6 2 9
堆顶元素与末尾元素交换,即现在序列为:2 7 5 3 6 8 9(此时8和9 都已确定)

重复上述步骤:

最终排序为:2 3 5 6 7 8 9
2
3 5
6 7 8 9

2.3代码实现

#include <stdio.h>
int a[]={2,6,8,3,7,9,5},n=7;
void Exchange(int i,int n)
{
	int wm;
	wm=a[i];
	a[i]=a[n];
	a[n]=wm;
}
void HeapSort(int n)
{
	int i,s;
	if(n==2)
	{
		if(a[0]>a[1])
		{
			printf("%d %d\n",a[0],a[1]);
	    }
		else
			printf("%d %d\n",a[1],a[0]);
		return;
    }
    for(i=n/2-1;i>=0;i--)
    {
    	if(a[2*i+1]>a[i]&&2*i+1<n)
    		Exchange(i,2*i+1);
    	if(a[2*i+2]>a[i]&&2*i+2<n)
    		Exchange(i,2*i+2);
	}
	s=a[0];
	a[0]=a[n-1];
	a[n-1]=s;
	printf("%d ",a[n-1]);
	HeapSort(n-1);
}
int main()
{
	int i;
	HeapSort(n);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值