排序算法

1.冒泡排序

冒泡排序的基本思想是:一个有n个数的数组a[n],从第一个开始,依次比较相邻的两个数是否位逆序对(大的在前,小的在后),则交换这两个数。经过一轮的比较之后,数组中最大的数会被拍到最后面,这样n个数的排序规模就转换为了n-1个数的排序规模。
实现代码如下:

for(int i=n-1;i>=1;i--)   //进行n-1次冒泡
for(int j=0;j<i;j++)      //进行i次比较
if(a[j]>a[j+1]) swap(a[j],a[j+1]); //相邻两个数比较若为逆序对则进行交换
                                   //swap交换函数,使a[j]和a[j+1]交换数值
                                   //在iostream头文件中

冒泡排序的时间复杂度是o(n^2),需要的时间较长。

2.桶排序

桶排序的思想是:若待排序的值在一个较小的有限范围内时,可设计有限个有序桶,将待排序的值装入桶中,桶号就是待排序的值,顺序输出各桶的值,将得到有序的序列。
实现代码如下:

#include <iostream>
using namespace std;
int main()
{
     int a[101]={0},n;
     cin>>n;
     for(int i=1;i<=n;i++)
     {
         int x;
         cin>>x; a[x]++;
     }
     for(int i=0;i<=100;i++)
     while(a[i]){
         cout<<i<<" ";
         a[i]--;
     }
}

桶排序这种方法并不是很常用,但是这种思想需要掌握。它的时间复杂度是o(n)。

3.快速排序

快速排序是对冒泡排序的一种改进,它的基本思想是:通过一趟排序将待排序列分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分序列继续进行排序,以达到整个序列有序。
具体实现如下:

void quick_sort(int a[],int l,int r)  //待排序的序列的左右端点l,r
{
     int i,j,mid;
     i=l,j=r;
     mid=a[(l+r)/2];
     do{
          while(a[i]<mid) i++;       //寻找左半边中比中间数大的数
          while(a[j]>mid) j--;       //寻找右半边中比中间数小的数
          if(j>=i)   
          {
               swap(a[i],a[j]);      //若找到一组与排序目标不一致的数对,
                                     //则交换它们
               i++; j--;
          }
     }while(j>=i);   
     if(l<j) quick_sort(a,l,j);
     if(i<r) quick_sort(a,i,r);
}

快排的时间复杂度是o(nlogn),就平均速度而言,是目前最好的一种内部排序方法。

4.归并排序

归并排序的基本思想是:先将一个序列分割成一些较小的有序子序列,再将这些有序子序列拼接成一个完全有序的完整序列。其两大步骤即为分解和合并。
具体代码如下:

int tmp[1e5];
merge_sort(int a[],int l,int r)
{
    if(l>=r) return;
    int mid=(l+r)/2;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r)
    {
        if(a[i]<a[j]) tmp[k++]=a[i++];
        else tmp[k++]=a[j++];
    }
    while(i<=mid) tmp[k++]=a[i++];
    while(j<=r) tmp[k++]=a[j++];
    for(i=l,j=0;i<=r;i++,j++)
    a[i]=tmp[j];
}

归并排序的时间复杂度也是o(nlogn),但归并排序需要的辅助空间较多。

5.sort函数

sort函数是一个排序函数,可将一个数组从小到大进行排序,位于algorithm头文件中。

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n,a[1005]={0};
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    sort(a,a+n);     //如果a的下标从1开始则为sort(a+1,a+1+n);
    for(int i=0;i<n;i++)
    cout<<a[i]<<' ';
}

这样可以将数组从小到大进行排序,如果想要从大到小排序则可以加上函数reverse,作用是将数组进行反转。写法与sort相同,也在algorithm头文件中。

sort(a,a+n);    //将数组a进行排序
reverse(a,a+n); //反转数组a

或者给sort加一个参数:

sort(a,a+n,greater<int>());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lwz_159

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

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

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

打赏作者

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

抵扣说明:

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

余额充值