各种排序

#include<iostream>
using namespace std;

//直接插入排序
void Insert(int *arr, int len)
{
    for(int i=0;i<len-1;++i)
    {
        if(arr[i+1]<arr[i])
        {
            int k=i;
            int tep = arr[i+1];
            while(arr[k]>tep && k>=0)
            {
                arr[k+1] = arr[k];
                k--;
            }
            arr[k+1]  =tep;
        }
    }
}

void show(int *arr, int len)
{
    for(int i=0;i<len;++i)
    {
        cout<<arr[i]<<' ';
    }
    cout<<endl;
}
//希尔排序
void Shell(int *arr , int len, int d)
{
    for(int i=d;i<len;i++)
    {
        if(arr[i]<arr[i-d])
        {
            int tep= arr[i];
            arr[i] = arr[i-d];
            arr[i-d] = tep;
        }
    }
}
//冒泡排序
void Pop(int *arr , int len)
{
    if(arr==NULL)
    {
        return ;
    }
    for(int j=1;j<len;j++)
    {
        int flg=0;
        for(int i=0;i<len-1;++i)
        {
            if(arr[i]>arr[i+1])
            {
                int tep = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = tep;
                flg=1;
            }
        }
        if(flg==0)
        {
            break;
        }
    }
}
//双向冒泡排序
void Doupop(int *arr , int len)
{
    if(arr == NULL)
    {
        return;
    }
    int swap=1;
    for(int i=1; swap!=0; ++i)
    {
        swap=0;
        for(int j=i;j<len;++j)
        {
            if(arr[j-1]>arr[j])
            {
                int tep = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tep;
                swap=1;
            }
        }
        for(int j=len-i; j>=0; j--)
        {
            if(arr[j]<arr[j-1])
            {
                int tep = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tep;
            }
        }
    }
}

//快速排序
int  Partion(int *arr , int beg, int end)
{
    int tep = arr[beg];
    while(beg<end)
    {
        while(beg<end && arr[end]>=tep)
        {
            end--;
        }
        if(beg<end)
        {
            arr[beg] = arr[end];
            beg++;
        }

        while(beg<end&& arr[beg]<=tep)
        {
            beg++;
        }
        if(beg<end)
        {
            arr[end] = arr[beg];
            end--;
        }
    }
    arr[beg] = tep;
    return beg;
}

void QuitSort(int *arr , int beg, int end)
{
    if(arr==NULL)
    {
        return ;
    }
    int i;
    if(beg<end)
    {
        i = Partion(arr , beg, end);
        QuitSort(arr , beg , i-1);
        QuitSort(arr , i+1,end);
    }
}
//直接选择排序
void SelectSort(int *arr , int n)
{
    int min;
    int k;
    for(int i=0;i<n-1;++i)
    {
        min = arr[i];
        for(int j=i+1;j<n;++j)
        {
            if(arr[j]<min)
            {
                min = arr[j];
                k=j;
            }
        }
        if(k!=i)
        {
            int tep = arr[i];
            arr[i] = arr[k];
            arr[k] = tep;
        }
    }
}

//堆排序学习的是海子老师的算法;
void HeapAdjust(int *a,int i,int size)  //调整堆 
{
    int lchild=2*i;       //i的左孩子节点序号 
    int rchild=2*i+1;     //i的右孩子节点序号 
    int max=i;            //临时变量 
    if(i<=size/2)          //如果i是叶节点就不用进行调整 
    {
        if(lchild<=size&&a[lchild]>a[max])
        {
            max=lchild;
        }
        if(rchild<=size && a[rchild]>a[max])
        {
            max=rchild;
        }

        if(max!=i )
        {
            swap(a[i],a[max]);
            if(max<size/2)
            {
                HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆 
            }
        }
    }
}

void BuildHeap(int *a,int size)    //建立堆 
{
    int i;
    for(i=size/2;i>0;i--)    //非叶节点最大序号值为size/2 
    {
        HeapAdjust(a,i,size);    
    }    
} 

void HeapSort(int *a,int size)    //堆排序 
{
    int i;
    BuildHeap(a,size);
    for(i=size;i>=1;i--)
    {
        //cout<<a[1]<<" ";
        swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 
        //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆 
        HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆
    }
} 


int main()
{
    int arr[] = {-1,9,8,7,6,5,4,3,2,1,0};
    int len =  sizeof(arr)/sizeof(arr[0]);
    /*cout<<len<<endl;
    Insert(arr , len);
    show(arr,len);
    cout<<endl;
    for(int i=4;i>=0;i--)
    {
    Shell(arr, len , i);
    }
    show(arr, len);
    Pop(arr , len);
    Doupop(arr , len);
    QuitSort(arr , 0, len-1);
    SelectSort(arr , len);*/
    HeapSort(arr , len-1);
    show(arr, len);

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值