sort算法排序 std_排序算法,你会几个???

e9aab4f2a2529342585d624a9faa8f44.png

作者 |  三玖天下第一   

来源 | cnblogs.com/hzoi-liujiahui/p/13256439.html

1、冒泡排序

  • 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

1.1 算法描述
  • n个元素的序列,经过n-1趟选择排序得到有序结果。具体算法描述如下:

  1. 初始状态:无序区为R[1..n],有序区为空;

  2. 每一轮从无序区起点开始,相邻元素两两比较,如果前面的比后面的元素大就交换,直到无序区最后。

  3. 针对所有的元素重复以上的步骤,每一轮冒泡操作无序区域元素减一,有序区元素减一;

  4. 重复执行n-1轮,序列变为有序。

1.2 动图演示

40cca4326fb3c2d6ea6d34d02990717d.png

1.3 代码实现

#include const int maxn=1e4+5,Inf=2147483647;int a[maxn];int n;void Read(){scanf("%d",&n);
  srand(time(0));for(int i=1;i<=n;++i)
    a[i]=rand()%10000;
}void Print(){for(int i=1;i<=n;++i)printf("%d ",a[i]);
}void Bubble_sort(int a[]){for(int i=1;i//经过n-1轮的冒泡操作
    for(int j=1;j<=n-i;++j)//没操作一轮,待排序的少一个
      if(a[j]>a[j+1])
        std::swap(a[j],a[j+1]);
  }
}
void Solve(){
  Read();
  Bubble_sort(a);
  Print();
}
int main(){
  Solve();
  return 0;
}

2.选择排序

  • 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

2.1 算法描述
  • n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  1. 初始状态:无序区为R[1..n],有序区为空;

  2. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

  3. n-1趟结束,数组有序化了。

2.2 动图演示

45f1a4dfc8a4bcf759ccfbd028fb9b2a.png

2.3 代码实现
#include 
const int maxn=1e4+5,Inf=2147483647;
int a[maxn];
int n;
void Read(){
  scanf("%d",&n);
  srand(time(0));
  for(int i=1;i<=n;++i)
    a[i]=rand()%10000;
}
void Print(){
  for(int i=1;i<=n;++i)
    printf("%d ",a[i]);
}
void Select_sort(int a[]){
  int k=0;
  for(int i=1;i//n-1轮,每一轮找到一个最小的
    k=i;//k指向未排序的最小for(int j=i+1;j<=n;++j)if(a[k]>a[j])
        k=j;std::swap(a[i],a[k]);
  }
}void Solve(){
  Read();
  Select_sort(a);
  Print();
}int main(){
  Solve();return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值