常用排序算法实现

冒泡排序

#include<iostream>

using namespace std;

void BubbleSortAsc(double num[],int length)
{
    bool exchange=true;
    for(int i=0;i<length-1;i++)
    {
        for(int j=0;j<length-1-i;j++)
        {
            if(num[j]>num[j+1])
            {
                double t=num[j];
                num[j]=num[j+1];
                num[j+1]=t;
                exchange=false;
            }
        }
        if(exchange)
            break;
    }
}

void BubbleSortDesc(double num[],int length)
{
    bool exchange=true;
    for(int i=0;i<length-1;i++)
    {
        for(int j=0;j<length-1-i;j++)
        {
            if(num[j]<num[j+1])
            {
                double t=num[j];
                num[j]=num[j+1];
                num[j+1]=t;
                exchange=false;
            }
        }
        if(exchange)
            break;
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    BubbleSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

优化

#include<iostream>

using namespace std;

void BubbleSortAsc(double num[],int length)
{
    bool exchange=true;
    int pos,k=length-1,n=0;//n:最小值下标(首指针);k:最大值下标(尾指针);pos:用于记录最后一次交换的位置
    for(int i=0;i<length-1;i++)
    {
        //正向寻找最大值
        pos=0;
        for(int j=n;j<k;j++)
        {
            if(num[j]>num[j+1])
            {
                double t=num[j];
                num[j]=num[j+1];
                num[j+1]=t;
                exchange=false;
                pos=j;
            }
        }
        if(exchange)
            break;
        k=pos;
        //反向寻找最小值
        for(int j=k;j>n;j--)
        {
            if(num[j]<num[j-1])
            {
                double t=num[j-1];
                num[j-1]=num[j];
                num[j]=t;
                exchange=false;
            }
        }
        n++;
        if(exchange)
            break;
    }
}

void BubbleSortDesc(double num[],int length)
{
    bool exchange=true;
    int pos,k=length-1,n=0;
    for(int i=0;i<length-1;i++)
    {
        //正向寻找最小值
        pos=0;
        for(int j=n;j<k;j++)
        {
            if(num[j]<num[j+1])
            {
                double t=num[j];
                num[j]=num[j+1];
                num[j+1]=t;
                exchange=false;
                pos=j;
            }
        }
        if(exchange)
            break;
        k=pos;
        //反向寻找最大值
        for(int j=k;j>n;j--)
        {
            if(num[j]>num[j-1])
            {
                double t=num[j];
                num[j]=num[j-1];
                num[j-1]=t;
                exchange=false;
            }
        }
        n++;
        if(exchange)
            break;
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    BubbleSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

选择排序

#include<iostream>

using namespace std;

void SelectionSortAsc(double num[],int length)
{
    int minindex;
    for(int i=0;i<length-1;i++)
    {
        minindex=i;
        for(int j=i+1;j<length;j++)
        {
            if(num[j]<num[minindex])
                minindex=j;
        }
        double t=num[minindex];
        num[minindex]=num[i];
        num[i]=t;
    }
}

void SelectionSortDesc(double num[],int length)
{
    int maxindex;
    for(int i=0;i<length-1;i++)
    {
        maxindex=i;
        for(int j=i+1;j<length;j++)
        {
            if(num[j]>num[maxindex])
                maxindex=j;
        }
        double t=num[maxindex];
        num[maxindex]=num[i];
        num[i]=t;
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    SelectionSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

优化

#include<iostream>

using namespace std;

void SelectionSortAsc(double num[],int length)
{
    int minindex,maxindex,left,right;
    for(left=0,right=length-1;left<=right;left++,right--)
    {
        minindex=left;
        maxindex=right;
        for(int i=left;i<=right;i++)
        {
            if(num[i]<num[minindex])
                minindex=i;
            if(num[i]>num[maxindex])
                maxindex=i;
        }
        if(minindex!=left)
        {
            double t=num[minindex];
            num[minindex]=num[left];
            num[left]=t;
            if(maxindex==left)
                maxindex=minindex;

        }
        if(maxindex!=right)
        {
            double t=num[maxindex];
            num[maxindex]=num[right];
            num[right]=t;
        }
    }
}

void SelectionSortDesc(double num[],int length)
{
    int minindex,maxindex,left,right;
    for(left=0,right=length-1;left<=right;left++,right--)
    {
        minindex=right;
        maxindex=left;
        for(int i=left;i<=right;i++)
        {
            if(num[i]<num[minindex])
                minindex=i;
            if(num[i]>num[maxindex])
                maxindex=i;
        }
        if(maxindex!=left)
        {
            double t=num[maxindex];
            num[maxindex]=num[left];
            num[left]=t;
            if(minindex==left)
                minindex=maxindex;
        }
        if(minindex!=right)
        {
            double t=num[minindex];
            num[minindex]=num[right];
            num[right]=t;
        }
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    SelectionSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

插入排序

#include<iostream>

using namespace std;

void InsertionSortAsc(double num[],int length)
{
    int preindex;
    double current;
    for(int i=1;i<length;i++)
    {
        if(num[i]>num[i-1])
            continue;//小优化,如果已排好则后面不用执行
        preindex=i-1;
        current=num[i];
        while(preindex>=0&&num[preindex]>current)
        {
            num[preindex+1]=num[preindex];
            preindex--;
        }
        num[preindex+1]=current;
    }
}

void InsertionSortDesc(double num[],int length)
{
    int preindex;
    double current;
    for(int i=1;i<length;i++)
    {
        if(num[i]<num[i-1])
            continue;
        preindex=i-1;
        current=num[i];
        while(preindex>=0&&num[preindex]<current)
        {
            num[preindex+1]=num[preindex];
            preindex--;
        }
        num[preindex+1]=current;
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    InsertionSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

折半插入排序

#include<iostream>

using namespace std;

void BinaryInsertionSortAsc(double num[],int length)
{
    int left,right,mid;
    double current;
    for(int i=1;i<length;i++)
    {
        left=0;
        right=i-1;
        current=num[i];
        while(left<=right)
        {
            mid=left+(right-left)/2;//效果等同于(left+right)/2,而且可以防止left+right的和溢出
            if(current<=num[mid])
                right=mid-1;
            else if(current>num[mid])
                left=mid+1;
        }
        for(int j=i;j>left;j--)
            num[j]=num[j-1];
        num[left]=current;
    }
}

void BinaryInsertionSortDesc(double num[],int length)
{
    int left,right,mid;
    double current;
    for(int i=1;i<length;i++)
    {
        left=0;
        right=i-1;
        current=num[i];
        while(left<=right)
        {
            mid=left+(right-left)/2;
            if(current>=num[mid])
                right=mid-1;
            else if(current<num[mid])
                left=mid+1;
        }
        for(int j=i;j>left;j--)
            num[j]=num[j-1];
        num[left]=current;
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    BinaryInsertionSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

希尔排序

#include<iostream>

using namespace std;

void ShellSortAsc(double num[],int length)
{
    int gap=length,preindex;
    double current;
    while(gap>1)
    {
        gap=gap/3+1;
        for(int i=gap; i<length; i++)
        {
            preindex=i-gap;
            current=num[i];
            while(preindex>=0&&num[preindex]>current)
            {
                num[preindex+gap]=num[preindex];
                preindex-=gap;
            }
            num[preindex+gap]=current;
        }
    }
}

void ShellSortDesc(double num[],int length)
{
    int gap=length,preindex;
    double current;
    while(gap>1)
    {
        gap=gap/3+1;
        for(int i=gap; i<length; i++)
        {
            preindex=i-gap;
            current=num[i];
            while(preindex>=0&&num[preindex]<current)
            {
                num[preindex+gap]=num[preindex];
                preindex-=gap;
            }
            num[preindex+gap]=current;
        }
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    ShellSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

快速排序

#include<iostream>

using namespace std;

void QuickSortAsc(double num[],int left,int right)
{
    int i=left,j=right;
    double mid=num[(left+right)/2];
    do
    {
        while(num[i]<mid)
            i++;
        while(num[j]>mid)
            j--;
        if(i<=j)
        {
            double t=num[i];
            num[i]=num[j];
            num[j]=t;
            i++;
            j--;
        }
    }while(i<=j);
    if(left<j) QuickSortAsc(num,left,j);
    if(i<right) QuickSortAsc(num,i,right);
}

void QuickSortDesc(double num[],int left,int right)
{
    int i=left,j=right;
    double mid=num[(left+right)/2];
    do
    {
        while(num[i]>mid)
            i++;
        while(num[j]<mid)
            j--;
        if(i<=j)
        {
            double t=num[i];
            num[i]=num[j];
            num[j]=t;
            i++;
            j--;
        }
    }while(i<=j);
    if(left<j) QuickSortDesc(num,left,j);
    if(i<right) QuickSortDesc(num,i,right);
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    QuickSortDesc(num,0,length-1);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

快速排序(挖坑法)

#include<iostream>

using namespace std;

void QuickSortAsc(double num[],int left,int right)
{
    int i=left,j=right;
    double tmp=num[left];
    while(i<j)
    {
        while(i<j&&num[j]>=tmp)
            j--;
        if(i<j)
            num[i++]=num[j];
        while(i<j&&num[i]<=tmp)
            i++;
        if(i<j)
            num[j--]=num[i];
    }
    num[i]=tmp;
    if(left<j-1) QuickSortAsc(num,left,i-1);
    if(i+1<right) QuickSortAsc(num,i+1,right);
}

void QuickSortDesc(double num[],int left,int right)
{
    int i=left,j=right;
    double tmp=num[left];
    while(i<j)
    {
        while(i<j&&num[j]<=tmp)
            j--;
        if(i<j)
            num[i++]=num[j];
        while(i<j&&num[i]>=tmp)
            i++;
        if(i<j)
            num[j--]=num[i];
    }
    num[i]=tmp;
    if(left<j-1) QuickSortDesc(num,left,i-1);
    if(i+1<right) QuickSortDesc(num,i+1,right);
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    QuickSortDesc(num,0,length-1);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

归并排序

#include<iostream>

using namespace std;

void mergeAsc(double num[],int left,int mid,int right)
{
    double tmp[right-left+1];
    int p1=left,p2=mid+1,index=0;
    while(p1<=mid&&p2<=right)
    {
        if(num[p1]<num[p2])
        {
            tmp[index]=num[p1];
            p1++;
            index++;
        }
        else
        {
            tmp[index]=num[p2];
            p2++;
            index++;
        }
    }
//简洁写法:
//while(p1<=mid&&p2<=right)
//    tmp[index++]=num[p1]<num[p2]?num[p1++]:num[p2++];
    while(p1<=mid)//将左边剩余元素填充进tmp中
    {
        tmp[index]=num[p1];
        p1++;
        index++;
    }
//简洁写法:
//while(p1<=mid)
//    tmp[index++]=num[p1++];
    while(p2<=right)//将右序列剩余元素填充进tmp中
    {
        tmp[index]=num[p2];
        p2++;
        index++;
    }
//简洁写法
//while(p2<=right)
//    tmp[index++]=num[p2++];
    for(int i=0;i<right-left+1;i++)
        num[left+i]=tmp[i];
}

void MergeSortAsc(double num[],int left,int right)
{
    if(left>=right)
        return;
    int mid=(left+right)/2;
    MergeSortAsc(num,left,mid);
    MergeSortAsc(num,mid+1,right);
    mergeAsc(num,left,mid,right);
}

void mergeDesc(double num[],int left,int mid,int right)
{
    double tmp[right-left+1];
    int p1=left,p2=mid+1,index=0;
    while(p1<=mid&&p2<=right)
        tmp[index++]=num[p1]>num[p2]?num[p1++]:num[p2++];
    while(p1<=mid)
        tmp[index++]=num[p1++];
    while(p2<=right)
        tmp[index++]=num[p2++];
    for(int i=0;i<right-left+1;i++)
        num[left+i]=tmp[i];
}

void MergeSortDesc(double num[],int left,int right)
{
    if(left>=right)
        return;
    int mid=(left+right)/2;
    MergeSortDesc(num,left,mid);
    MergeSortDesc(num,mid+1,right);
    mergeDesc(num,left,mid,right);
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    MergeSortDesc(num,0,length-1);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

堆排序

#include<iostream>

using namespace std;

void adjustAsc(double num[],int i,int length)
{
    int j,flag=0;
    while(2*i+1<length&&flag==0)
    {
        j=2*i+1;
        if(j+1<length&&num[j]<num[j+1])
            j++;
        if(num[j]>num[i])
        {
            double tmp=num[i];
            num[i]=num[j];
            num[j]=tmp;
            i=j;//更新i为刚才与它交换的儿子结点的编号,便于接下来继续向下调整
        }
        else
            flag=1;
    }
}

void HeapSortAsc(double num[],int length)
{
    //构建大顶堆
    for(int i=length/2-1;i>=0;i--)
        adjustAsc(num,i,length);
    //交换堆顶元素与末尾元素+调整堆结构
    for(int i=length-1;i>0;i--)
    {
        double tmp=num[0];
        num[0]=num[i];
        num[i]=tmp;
        adjustAsc(num,0,i);
    }
}

void adjustDesc(double num[],int i,int length)
{
    int j,flag=0;
    while(2*i+1<length&&flag==0)
    {
        j=2*i+1;
        if(j+1<length&&num[j+1]<num[j])
            j++;
        if(num[j]<num[i])
        {
            double tmp=num[i];
            num[i]=num[j];
            num[j]=tmp;
            i=j;
        }
        else
            flag=1;
    }
}

void HeapSortDesc(double num[],int length)
{
    for(int i=length/2-1;i>=0;i--)
        adjustDesc(num,i,length);
    for(int i=length-1;i>0;i--)
    {
        double tmp=num[0];
        num[0]=num[i];
        num[i]=tmp;
        adjustDesc(num,0,i);
    }
}

int main()
{
    double num[1000];
    int length;
    for(length=0;cin>>num[length];length++);
    HeapSortDesc(num,length);
    for(int i=0;i<length;i++)
        cout<<num[i]<<" ";
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h0l10w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值