堆排序(c实现)

来源:互联网 发布:id for mac中文破解版 编辑:程序博客网 时间:2024/04/30 05:06
int sort_heap(int arr[],int len){        int k,i,j,l;        for(k=len;k>1;k--)//len-1次循环        {                for(i=k/2;i>=0;i--)//从中间位置开始遍历                {                        for(j=i;j*2+1<k;)//child进行遍历                        {                                l=j*2+1;//left child                                if(l+1<k && arr[l]<arr[l+1])                                {                                        l++;                                }                                if(arr[l]>arr[j])                                {                                        swap(&arr[l],&arr[j]);                                        j=l;                                }                                else                                {                                        break;                                }                        }                }                swap(&arr[0],&arr[k-1]);        }}
extern int swap(int *a , int *b){        *a = *a ^ *b;        *b = *a ^ *b;        *a = *a ^ *b;}
int main(){        int arr[8]={2,3,5,1,9,8,4,6},i;        sort_heap(arr,8);        for(i=0;i<8;i++)        {                printf ("%d,",arr[i]);        }        return 0;}

堆排主要分两步:

1、循环n-1次,每次找出最大的一个,然后与最后一个替换,循环一次,将最大索引-1

2、从中间开始循环,将最大的一个放入支点,并将子节点按大小顺序排好


0 0
原创粉丝点击