堆排序

来源:互联网 发布:创业软件股份ceo 编辑:程序博客网 时间:2024/06/15 22:32

堆排序:
1,开始建堆,已一个小根堆为例:(图片摘自别人,与下面的排序代码无关)


建堆

构造好了堆之后,下面就是排序的过程:


排序


直接上代码了:

#include<iostream>using namespace std;void sift(int a[],int m,int n);void sorts(int a[],int n);void swaps(int *sa,int *b);int main(){    int a[7] = {0,23,45,1,4,5,18};    sorts(a,6);    for(int i = 1 ; i<=6; i++)        cout<<a[i]<<'\t';}void sift(int a[],int m,int n)//形成堆,m为要排的元素,n为a的个数{    int i = m, j = 2*m;    while(j <= n)    {        if(j<n&&a[j]<a[j+1])j++;        if(a[i]>a[j])break;        else        {            swaps(&a[i],&a[j]);            i = j;            j = 2*i;        }    }}void sorts(int a[],int n)//排序{    int i = n/2;    for(int j = i ; j>=1 ; j--)    {        sift(a,j,n);    }    for(int k = 1; k<n ; k++)//形成的堆,将堆头,和最后一个叶子节点交换    {        swaps(&a[1],&a[n-k+1]);        sift(a,1,n-k);//重新排列    }}void swaps(int *a, int *b){    int temp;    temp = *a;    *a = *b;    *b = temp;}

由于是从第二个元素开始排序的也就是a[1],所以第一个元素没有排序,可以在初始化的时候声明为0。


2017/8/7/13:32

今天在算法导论上看到一种用递归实现的方法,只需要把上面的sift方法换一下即可:

void sift2(int a[],int m,int n){    int i = m,j = 2*m,k=2*m+1;    int largest;    if(largest > n)return;    if(a[i]>a[j])largest = i;    else j = largest;    if(a[k]>a[largest]) largest = k;    if(i!= largest)    {        swaps(&a[i],&a[largest]);        sift2(a,largest,n);    }}
原创粉丝点击