几种排序算法

排序方法

                1,直接插入排序

                2,希尔排序

                3,快速排序

                4,简单选择排序

                5,堆排序

1,直接插入排序

直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的且记录数增加了1的有序表。

输入

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。

#include <iostream>
 
using namespace std;
 
int main()
{
    int i,j,m;
    cin>>m;
    int a[m+1];
    for(i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(i=2;i<=m;i++)
    {
        if(a[i]<a[i-1])
        {
            a[0]=a[i];
            for(j=i-1;a[0]<a[j];j--)
            {
                a[j+1]=a[j];
            }
            a[j+1]=a[0];
        }
    }
    for(i=1;i<=m;i++)cout<<a[i]<<" ";
    return 0;
}

样例输入 Copy

10
2 8 4 6 1 10 7 3 5 9

样例输出 Copy

1 2 3 4 5 6 7 8 9 10 

 

 2,希尔排序

希尔排序又称“缩小增量排序”,它是一种属于插入排序类的排序方法,但是在时间效率方面较普通的插入排序方法有较大的改进。

希尔排序的基本思想是:先将整个待排序的序列分割成为若干子序列,并分别进行直接插入排序,当整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。

输入

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。

#include <iostream>
 
using namespace std;
 
int main()
{
    int i,j,k,m,dk[3]={1,3,5};
    cin>>m;
    int a[m+1];
    for(i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(k=0;k<3;k++)
    {
        for(i=dk[k]+1;i<=m;i++)
        {
            if(a[i]<a[i-dk[k]])
            {
                a[0]=a[i];
                for(j=i-dk[k];a[0]<a[j];j-=dk[k])
                {
                    a[j+dk[k]]=a[j];
                }
                a[j+dk[k]]=a[0];
            }
        }
    }
 
    for(i=1;i<=m;i++)cout<<a[i]<<" ";
    return 0;
}

样例输入 Copy

10
2 8 4 6 1 10 7 3 5 9

样例输出 Copy

1 2 3 4 5 6 7 8 9 10 

 

3,快速排序

快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。

输入

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。

#include <iostream>
 
using namespace std;
 
int Partition(int a[],int low,int high)
{
    int key;
    a[0]=a[low];
    key=a[low];
    while(low<high)
    {
        while(low<high&&a[high]>=key)high--;
        a[low]=a[high];
        while(low<high&&a[low]<=key)low++;
        a[high]=a[low];
    }
    a[low]=a[0];
    return low;
}
 
void Qsort(int a[],int low,int high)
{
    int loc;
    if(low<high)
    {
        loc=Partition(a,low,high);
        Qsort(a,low,loc-1);
        Qsort(a,loc+1,high);
    }
}
 
int main()
{
    int i,m;
    cin>>m;
    int a[m+1];
    for(i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    Qsort(a,1,m);
    for(i=1;i<=m;i++)cout<<a[i]<<" ";
    return 0;
}

样例输入 Copy

10
2 8 4 6 1 10 7 3 5 9

样例输出 Copy

1 2 3 4 5 6 7 8 9 10 

 

4,简单选择排序

选择排序的基本思想是:每一趟比较过程中,在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。

在多种选择排序中,最常用且形式最为简单的是简单选择排序。

输入

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。

#include <iostream>
 
using namespace std;
 
 
int main()
{
    int i,j,m,index,temp;
    cin>>m;
    int a[m+1];
    for(i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(i=1;i<m;i++)
    {
        index=i;
        for(j=i+1;j<=m;j++)
        {
            if(a[j]<a[index])
            {
                index=j;
            }
        }
        if(index!=i)
            {
                temp=a[i];
                a[i]=a[index];
                a[index]=temp;
            }
    }
    for(i=1;i<=m;i++)cout<<a[i]<<" ";
    return 0;
}

样例输入 Copy

10
2 8 4 6 1 10 7 3 5 9

样例输出 Copy

1 2 3 4 5 6 7 8 9 10 

 

5,堆排序

堆排序是一种利用堆结构进行排序的方法,它只需要一个记录大小的辅助空间,每个待排序的记录仅需要占用一个存储空间。

首先建立小根堆或大根堆,然后通过利用堆的性质即堆顶的元素是最小或最大值,从而依次得出每一个元素的位置。

输入

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。

#include <iostream>
 
using namespace std;
 
void Heapjust(int a[],int s,int m)
{
    int j,temp;
    temp=a[s];
    for(j=2*s;j<=m;j*=2)
    {
        if(j<m&&a[j]<a[j+1])j++;
        if(temp>=a[j])break;
        a[s]=a[j];
        s=j;
    }
    a[s]=temp;
}
 
void HeapSort(int a[],int m)
{
    int i;
    int temp;
    for(i=m/2;i>0;i--)
    Heapjust(a,i,m);
    for(i=m;i>1;i--)
    {
        temp=a[i];
        a[i]=a[1];
        a[1]=temp;
        Heapjust(a,1,i-1);
    }
}
int main()
{
    int i,m;
    cin>>m;
    int a[m+1];
    for(i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    HeapSort(a,m);
    for(i=1;i<=m;i++)cout<<a[i]<<" ";
    return 0;
}

 

样例输入 Copy

10
2 8 4 6 1 10 7 3 5 9

样例输出 Copy

1 2 3 4 5 6 7 8 9 10 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值