选择排序

  • Post author:
  • Post category:其他


简单选择排序(不稳定)

时间复杂度O(n2)

#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
void selectsort(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		int k=i;
		for(int j=i+1;j<n;j++) //寻找最小值    
		    if(a[k]>a[j])
	                k=j;
		if(k!=i)             
		     swap(a[i],a[k]);  //最小值与待排数据交换位置
	}
}
int main()
{
	int a[]={1,5,3,51,24,0};
	selectsort(a,6);
	for(int i=0;i<6;i++)
	cout<<a[i]<<" ";
}

堆排序(不稳定)

只能用于顺序排序,不能用于链式排序

时间复杂度O(nlog2n)

#include<iostream>
using namespace std;
void HeapAdjust(int a[],int s,int m)//筛选法调整堆(大顶堆)
{
	int tmp,j;
	tmp=a[s];
	for(j=2*s;j<=m;j*=2)      //筛选较大的孩子结点
	{
		if(j<m&&a[j]<a[j+1])
		++j;
		if(tmp>=a[j])
		break;
		a[s]=a[j]; s=j;
	}
	a[s]=tmp;                 //交换位置
}
void CreatHeap(int a[],int n) //建初堆(一个结点的树必是堆,完全二叉树中,所有序号大于n/2的结点都是叶子)
{
	for(int i=n/2;i>0;--i)    
	HeapAdjust(a,i,n);
}
void HeapSort(int a[],int n)  //堆排序
{
	int i,x;
	CreatHeap(a,n);
	for(i=n;i>1;--i)
	{                         //将堆顶值与最后序号的值交换位置
	x=a[1];
	a[1]=a[i];
	a[i]=x;
	HeapAdjust(a,1,i-1);
	}
}
int main()
{
	int a[9]={0,49,38,65,97,76,13,27,49};
	HeapSort(a,8);            //将数组从下标为1的位置开始存储数字 
	for(int i=1;i<9;i++)
	cout<<a[i]<<" ";
}



版权声明:本文为xiaoyao_zhang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。