排序算法之【打擂台算法】&【冒泡算法】&【选择排序】

简介: 排序算法之【打擂台算法】&【冒泡算法】&【选择排序】

博文内容:

本讲讲解排序算法里三种基本算法以及它们之间的区别

★博文转载请注明出处。

1. 打擂台算法:

实现步骤:

(1) 确定擂主(首个到场的即为擂主);

(2) 挑战者上台;

(3) 擂主和挑战者比较;挑战者胜的话,挑战者做擂主,否则擂主继续留在台上;

(5) 重复执行(2)~(3) 步骤,直到最后一个挑战者;

(6) 输出最后的擂主。

原理:

打擂台算法的原理是,默认一个值为最大元素,接着与各各元素进行比较,达到寻找最大值的目的

代码实现:

用打擂台法筛选出二维数组的最大值

#include<stdio.h>
#include<stdlib.h>
int main()
{
  int i, j;
  int arr[3][3] = { {7,14,15},{14,13,18},{12,19,15} };
  int max = arr[0][0];//设置擂主
  for (i = 0;i < 3;i++)
    for (j = 0;j < 3;j++)
      if (arr[i][j] > max)
        max = arr[i][j];//比擂主大就交换擂主
  printf("请输出最大值为:%d\n", max);
  return 0;
}

运行结果:

2. 冒泡算法实现排序:

冒泡法(也叫做起泡法)基本思路:

每次将相邻的两个数比较,将较小的那个调到前面。如果有6个数:9,8,5,4,2,0,第一次先将最前面的两个数8和9进行对调。第二次将第2个数和第3个数(9和5)进行对调……如此往复五次就可以得到8,5,4,2,0,9的顺序,可以看到:最大的数9已经“沉底”,成为了最下面的一个数,而小的数开始“上升”,经过第一趟(共5次比较与交换),已经把最大的数9放到了它该在的位置。


       如此循环往复,不难发现,我们只需要比较五趟,一趟把一个数放在正确的位置上,而每一趟的比较次数随着趟数的增加而减少。


规律:  

     我们可以根据上面6个数排序的可以拓展得到:如果有n个数,则要进行(n - 1)趟比较。在第一趟比较中要进行(n - 1)次两两比较,在第 j 趟比较中要进行(n - j)次比较。

代码实现:

//冒泡排序
#include<stdio.h>
int main()
{
  //先使用数组从终端输入十个数
  int a[10];
  int i=0,j=0,t=0;
  printf("请输入您想要排序的数字:\n");
  for (i = 0;i < 10;i++)
  {
    scanf("%d", &a[i]);
  }
  printf("\n");
  //排序过程
  for (j = 0;j < 9;j++)
  {
    for (i = 0;i < 9 - j;i++)
    {
      if (a[i] > a[i + 1])
      {
        t = a[i];
        a[i] = a[i + 1];
        a[i + 1] = t;
      }
    }
  }
  printf("排序后结果:\n");
  //输出十个数
  for (i = 0;i < 10;i++)
  {
    printf("%d ", a[i]);
  }
  return 0;
}

运行结果:

打擂与冒泡:

其实指定第一个元素为最大元素的打擂台和冒泡法的原理相似,不过打擂台算法并不改变二维数组,只是通过比较将最大元素进行输出赋值给max。

3. 选择排序

基本思想:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。


选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。


                                                                                                                          ----developer1024      

实现过程:

1. 第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换

2. 第二轮从下标为 2 到下标为 n-1 的元素中选取最小值,若小于第二个数,则交换

       依次类推

动图展示:

动图来自知乎developer1024

红色表示当前最小值,黄色表示已排序序列,绿色表示当前位置。

具体的我们以一组无序数列为例分解说明

来自developer1024

代码实现:

#include <stdio.h>
int main()
{
    void sort(int array[],int n);
    int a[10],i;
     printf("enter array:\n");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    sort(a,10);
    printf("The sorted array:\n");
    for(i=0;i<10;i++)
     printf("%d ",a[i]);
    printf("\n");
    return 0;
} 
void sort(int array[],int n)
 {
    int i,j,k,t;
     for(i=0;i<n-1;i++)//趟数
     {
     //一趟选出一个最小的数记录
         k=i;
         for(j=i+1;j<n;j++)
             if(array[j]<array[k])
               k=j;//记录下标
       t=array[k];
         array[k]=array[i];
         array[i]=t;
  }
 }

运行结果:

4. 对比总结:

冒泡排序是通过相邻的比较和交换

所谓选择排序就是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。

他们都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面

而打擂台就是选出一个值,再将其他的数依次和它进行比较

后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                              ——By 作者:天空の乌托邦

相关文章
|
5月前
|
搜索推荐
选择排序与其它排序算法比较
选择排序与冒泡排序同属O(n²)排序算法,但选择排序不稳定。相比堆排序,虽每轮均选最大元素,但选择排序基于线性结构,效率较低,而堆排序利用大顶堆结构提升了选择效率。
98 0
|
5月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
194 0
|
10月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
263 8
算法系列之排序算法-堆排序
|
9月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
552 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
172 0
数据结构与算法学习十四:常用排序算法总结和对比
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
455 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
搜索推荐
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
246 1
|
算法
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
138 1
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
247 0

热门文章

最新文章