/**
*
* Coder: LinX 2017-7-18 - 2017-7-21
*
* 内容: 选择类排序
*
*/
#include <stdio.h>
#include <stdlib.h>
void selectSort(int *a,int len); //简单选择排序排序
void heapSort(int *a,int len); //堆排序(大顶)
void out(int *a,int len);
int main()
{
int a[9]={0,49,38,65,97,76,13,27,49};
heapSort(a,8);
printf("\n");
out(a,9);
return 0;
}
/*堆排序*/
//堆排序思想: 将待排序的序列(数组)视为完全二叉树,根据完全二叉树的一些特征:如第i个
//元素的左孩子节点为2*i-1,右孩子为2*i+1。 大概过程: 1.先进行整体微调,从第一个非叶子
//节点开始从右至左,从下至上将树调整(将当前的节点a与其孩子节点进行比较,如果存在大于a
//值的孩子节点,则从中选出最大的一个与a交换,重复此过程)为大顶堆 2.将当前无序序列的第一
//个关键字a与最后一个关键字b交换,a进入有序序列,无序序列中的关键字减少一个,有序序列中
//的关键字增加一个,然后接着调整 3.重复第二部,直到无序序列中的关键字剩下一个时排序结束
void sift(int *a,int len,int i,int j)
{
int temp,max=i;
if(i<=j/2)
{
//与左孩子比较
if(2*i<=j&&a[2*i]>a[max])
{
max=2*i;
}
//与右孩子比较
if(2*i+1<=j&&a[2*i+1]>a[max])
{
max=2*i+1;
}
//printf("--%d--",a[max]);
//交换
if(i!=max)
{
swap(&a[i],&a[max]);
sift(a,len,max,j);
}
//printf("%d ",a[i]);
}
}
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void heapSort(int *a,int len)
{
int i,left,temp;
//调整成大顶堆
for(i=len/2;i>0;i--)
{
sift(a,len,i,len);
}
for(i=len;i>0;i--)
{
swap(&a[1],&a[i]);
sift(a,len,1,i-1);
}
}
/*简单选择排序*/
//选择排序意义是每次选择无序序列中最小的元素放到有序序列最右边
void selectSort(int *a,int len)
{
int i,j,temp,k;
for(i=0;i<len;i++)
{
k=i;
for(j=i+1;j<len;j++)
{
if(a[j]<a[k])
{
k=j;
}
}
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
void out(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}