首页 > 代码库 > 选择类排序总结

选择类排序总结

选择类排序总结

所谓选择类排序的思想就是:从数组的中选出最大或最小的,通过多次选择最后达到排序的目的

 

首先是简单选择排序

思想:每趟扫描中,选出最小的数字放在最前面,然后从第二个数字开始扫描,直到只剩下最后一个数不需要扫描

void EasySelect_Sort(int a[],int n)
{
	int k;
	for(int i=1;i<n;i++)
	{
		k=i-1;
		for(int j=i;j<n;j++)
		{
			if(a[j]<a[k])
			{
				k=j;
			}
		}
		if(k!=(i-1))
		{
			int temp=a[i-1];
			a[i-1]=a[k];
			a[k]=temp;
		}
	}
}

  

经过分析可以得到,最坏时间复杂度为O(n2),最好时间复杂度为O(n2)

空间复杂度为O(1);

简单选择排序是不稳定的!,例如3,3,2

 

 

 

二.堆排序

上面的简单选择排序中,一趟只能选出一个最大的,一趟比较完之后第二趟重新开始比较,这样一来,第一趟比较时的结果就浪费了,我们如果能够将他们利用起来的话,可想而知,可以提高不少效率,堆排序就是在这样的情况下提出来的

 

堆排序通过维护堆的数据特点,来实现排序,所谓堆,分为大根堆和小根堆,大根堆就是,根节点大于左子结点且根节点大于右子结点(a[i]>=a[2i]&&a[i]>=a[2i+1])

我们以大根堆为例,分析,堆排序的过程:

堆排序分为:维护堆,建立堆,堆排序三个过程

 

所谓维护堆:

 

选择类排序总结