常见的排序方法 c++

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

class sort_scf
{
public:
    int a[20];
    void maopao1(int a[],int len)
    {
        for(int i=0; i<len; i++)
        {
            for(int j=0; j<len-1-i; j++)
            {
                if(a[j]>a[j+1])
                {
                    swap_my(a[j],a[j+1]);
                }
            }
        }
    }
    void maopao2(int a[],int len)
    {
        int flag=true;
        for(int i=0; i<len&&flag; i++)
        {
            flag=false;
            for(int  j=0; j<len-i-1; j++)
            {
                if(a[j]>a[j+1])
                {
                    swap_my(a[j],a[j+1]);
                    flag=true;
                }
            }
        }
    }
    void maopao3(int a[],int len)
    {

        int pos=0;
        int k=len-1;
        int flag;
        for(int i=0; i<len; i++)
        {
            flag=0;
            for(int j=0; j<k; j++)
            {
                if(a[j]>a[j+1])
                {
                    swap_my(a[j],a[j+1]);
                    flag=1;
                    pos=j;
                }
            }
            k=pos;
            if(flag==0)
                return ;
        }
    }
    void jiandan_select(int a[],int len)
    {
        for(int i=0; i<len-1; i++)
        {
            int index=i;
            for(int j=i+1; j<len; j++)
            {
                if(a[j]<a[index])
                {
                    index=j;
                }
            }
            swap_my(a[index],a[i]);
        }
    }
    void charu_sort(int a[],int len)
    {
        for(int i=1; i<len; i++)
        {
            int j;
            for( j=i-1; j>=0; j--)
            {
                if(a[j]<a[i])
                    break;
            }
            if(j!=i-1)
            {
                j++;
                int temp=a[i];
                int k;
                for( k=i; k>j; k--)
                {
                    a[k]=a[k-1];
                }
                a[j]=temp;
            }
        }
    }
    void zheban_charu_sort(int a[],int len)
    {
        for(int i=1; i<len; i++)
        {
            int left=0;
            int right=i-1;
            int temp=a[i];
            while(left<=right)
            {
                int mid=(left+right)/2;
                if(a[mid]<temp)
                {
                    left=mid+1;
                }
                else
                {
                    right=mid-1;
                }
            }
            for(int j=i; j>left; j--)
                a[j]=a[j-1];
            a[left]=temp;
        }
    }
    void shell_sort(int a[],int len)
    {
        cout<<"希尔排序"<<endl;
        for(int gap=len/2; gap>=1; gap/=2)
        {
            for(int i=gap; i<len; i++)
            {
                for(int j=i-gap; j>=0; j-=gap)
                {
                    if(a[j]>a[j+gap])
                        swap_my(a[j],a[j+gap]);
                }
            }
        }
    }
    int quick_solve(int a[],int left,int right)
    {
        int i=0;
        int j=left+1;
        int temp=a[left];
        while(left<right)
        {

            while(left<right&&a[right]>=temp)
                right--;
            if(left<right)
                swap_my(a[left],a[right]);
            while(left<right&&a[left]<=temp)
                left++;
            if(left<right)
                swap_my(a[left],a[right]);
        }

        return left;
    }
    void quick_sort(int a[],int len)
    {
        quick(a,0,len-1);
    }
    void quick(int a[],int left,int right)
    {
        if(left<right)
        {
            int target=quick_solve(a,left,right);
            quick(a,left,target-1);
            quick(a,target+1,right);
        }
    }
    void merge_solve(int a[],int left,int mid,int right)
    {
        int temp[1000];
        memset(temp,0,sizeof(temp));
        int i=left;
        int j=mid+1;
        int k=0;
        while(i<=mid&&j<=right)
        {
            if(a[i]<a[j])
                temp[k++]=a[i++];
            else temp[k++]=a[j++];
        }
        while(i<=mid)
            temp[k++]=a[i++];
        while(j<=right)
            temp[k++]=a[j++];

        for(int i=0; i<k; i++)
            a[i+left]=temp[i];
    }
    void merge_(int a[],int left,int right)
    {
        if(left<right)
        {
            int mid=(left+right)/2;
            merge_(a,left,mid);
            merge_(a,mid+1,right);
            merge_solve(a,left,mid,right);
        }
    }
    void merge_sort(int a[],int len)
    {
        merge_(a,0,len-1);
    }
    void head_build(int a[],int index,int maxx)
    {
        int left=index*2+1;
        int right=left+1;
        int maxx_index=index;
        if(left<maxx&&a[left]>a[maxx_index])
            maxx_index=left;
        if(right<maxx&&a[right]>a[maxx_index])
            maxx_index=right;

        if(maxx_index!=index)
        {
            swap_my(a[index],a[maxx_index]);
            head_build(a,maxx_index,maxx);
        }
    }
    void head_sort(int a[],int len)
    {

        for(int i=len/2-1;i>=0;i--)
            head_build(a,i,len);
        for(int i=len-1;i>=1;i--)
        {
            swap_my(a[0],a[i]);
            head_build(a,0,i);
        }
    }

private:
    void swap_my(int &a,int &b)
    {
        a=a^b;
        b=a^b;
        a=a^b;
    }

};



int  main()
{
    sort_scf solve;
    int ans[20]= {1,2,7,4,8,9,6,3,5,0};
    int b[20];
    memcpy(solve.a,ans,sizeof(int)*20);
    for(int i=0; i<10; i++)
        cout<<solve.a[i]<<" ";
    cout<<endl<<"排序后"<<endl;
//    solve.maopao1(solve.a,10);
//    solve.maopao2(solve.a,10);
    //solve.maopao3(solve.a,10);
    //solve.jiandan_select(solve.a,10);
    //solve.charu_sort(solve.a,10);
    //solve.zheban_charu_sort(solve.a,10);
    // solve.shell_sort(solve.a,10);
//    solve.quick_sort(solve.a,10);
    //solve.merge_sort(solve.a,10);
    solve.head_sort(solve.a,10);
    for(int i=0; i<10; i++)
        cout<<solve.a[i]<<" ";
    cout<<endl;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值