您的位置:首页 > 其它

选择排序 (直接选择排序 ,堆排序)

2016-12-14 16:31 477 查看
1:直接选择排序

直接选择排序就是第一次先找出关键字最小的记录下来,并且与无序列区的第一个交换,,然后每次都这样查找

代码:
void choosesort(int a[],int sz)
{
for(int i=0; i<sz-1; i++)
{
int sentry=i;
for(int j=i+1; j<sz; j++)
{
if(a[j]<=a[sentry])
sentry=j;
}
swap(a[sentry],a[i]);
}
for(int i=0; i<11; i++)
{
cout<<a[i]<<" *";
}
cout<<endl;
}


2:堆排序
http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html
代码:

//堆筛选函数
//已知H[start~end]中除了start之外均满足堆的定义
//本函数进行调整,使H[start~end]成为一个大顶堆

void HeapAdjust(int a[], int start, int end)
{

int temp = a[start];

for(int i = 2*start + 1; i<=end; i*=2)
{
//因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2
if(i<end && a[i]<a[i+1])//左右孩子的比较
{
++i;//i为较大的记录的下标
}

if(temp > a[i])//左右孩子中获胜者与父亲的比较
{
break;
}

//将孩子结点上位,则以孩子结点的位置进行下一轮的筛选
a[start]= a[i];
start = i;

}

a[start]= temp; //插入最开始不和谐的元素
}

void heapsort(int a[], int n)
{
//先建立大顶堆
for(int i=n/2; i>=0; --i)
{
HeapAdjust(a,i,n);
}
//进行排序
for(int i=n-1; i>0; --i)
{
//最后一个元素和第一元素进行交换
swap(a[i],a[0]);

//然后将剩下的无序元素继续调整为大顶堆
HeapAdjust(a,0,i-1);
}

}


对于时间复杂度,直接选择排序时间复杂度为n*n,而堆排序时间复杂度为n*logn;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐