初识c语言————排序方法

今天我们学习的是c语言中的排序方法


目录:

一.冒泡排序法

二.选择排序法


下面我们正式学习c语言中的排序方法

一.冒泡排序法

1.冒泡排序法的过程:

将无序的数组通过数组之间的大小比较,排成有序的样子

2.例如:5,3,4,6 --->>3,5,4,6 --->>3,4,5,6 --->>3,4,5,6

第一轮排序(将最大值放到末尾)

  1. 比较 \*\*5\*\*, \*\*3\*\*, 4, 6`→ 5 > 3 → 交换
    → 数组变为 `3, 5, 4, 6`
  2. 比较 3, \*\*5\*\*, \*\*4\*\*, 6 → 5 > 4 → 交换
    → 数组变为 `3, 4, 5, 6`
  3. 比较 3, 4, \*\*5\*\*, \*\*6\*\*→ 5 < 6 → 不交换

结果:3, 4, 5, 6(最大值 6 已在末尾)


第二轮排序(检查剩余部分)

  1. 比较 \*\*3\*\*, \*\*4\*\*, 5, 6 → 3 < 4 → 不交换
  2. 比较 3, \*\*4\*\*, \*\*5\*\*, 6 → 4 < 5 → 不交换

结果:3, 4, 5, 6(无交换,排序完成)


最终结果:3, 4, 5, 6

3.注意:

***若数组中有n个元素,那么需要进行n-1次排序(考虑最坏的情况)

***因为每次排序是为了将最值放在数组末尾,所以每次排序只需进行n-a-1次比较(减少不必要的比较)

代码:

cpp 复制代码
#include <stdio.h>

void maopao(int num[],int n)
{
   for(int a=0;a<n-1;a++)
   {
      for(int b=0;b<n-a-1;b++)
      {
         if(num[b]>num[b+1])
            {
               int temp=num[b+1];
               num[b+1]=num[b];
               numb[b]=temp;
            }
       }
    }
}

void prinmao(int num[],int n)
{
   for(int a=0;a<=n-1;a++)
   { 
     printf("%d",num[a];
   }
}

int main()
{
   int num[]={2,6,7,9};
   int n=sizeof(num)/sizeof(num[0]);
   maopao(num,n);
   prinmao(num,n);
}

代码解析:

1.maopao函数是一个让数组进行冒泡排序的函数

prinmao函数是一个打印数组的函数

2.n是指num这个函数中元素的个数

所以对num进行冒泡排序只需进行n-1个排序

3.因为每次的排序会把最值放在末尾,所以为了节省空间,只需进行n-a-1个比较

4.因为在我们进行冒泡排序的时候比较方法是这种形式:numb>numb+1,所以我们在进行二次循环的时候应该是b<n-a-1,而不是b<=n-a-1,这样的目的是为了防止数组的下标溢出,而使用b<n-a-1也能保证每个数都参与了比较

二.选择排序法

1.选择排序法的过程:

假设第1个元素是最值,求第1个元素后面所有元素中比这个元素更最的值,将这个值与第1个元素进行值互换,然后在进行第二个元素,第三个元素------

2.例如:2,4,10,9 --->>10,4,2,9 --->>10,9,2,4 --->>10,9,4,2

第1轮排序**(i=0)

  • **未排序部分**:`\*\*2\*\*, 4, 10, 9`
  • 当前最小值:`2`(索引0)
  • 比较过程:
  • 2 < 4 → 保持
  • 2 < 10 → 保持
  • 2 < 9 → 保持
  • **无需交换**(最小值已在正确位置)

**本轮结果**:`\*\*2\*\*, 4, 10, 9`
(已排序部分:`2`,未排序部分:`4, 10, 9`)


第2轮排序**(i=1)

  • **未排序部分**:`2, \*\*4\*\*, 10, 9`
  • 当前最小值:`4`(索引1)
  • 比较过程:
  • 4 < 10 → 保持
  • 4 < 9 → 保持
  • **无需交换**(最小值已在正确位置)

**本轮结果**:`2, \*\*4\*\*, 10, 9`
(已排序部分:`2, 4`,未排序部分:`10, 9`)


第3轮排序**(i=2)

  • **未排序部分**:`2, 4, \*\*10\*\*, 9`
  • 当前最小值:`10`(初始索引2)
  • 比较过程:
  • 10 > 9 → 更新最小值为 `9`(索引3)
  • **交换 10 和 9**:
    ```c
    temp = 10;
    arr2 = 9;
    arr3 = 10;

**本轮结果**:`2, 4, \*\*9\*\*, 10`
(已排序部分:`2, 4, 9`,未排序部分:`10`)

**最终结果**:`2, 4, 9, 10`

(第4轮无需执行,因为最后一个元素自动就位)

3.注意:

***若数组中有n个元素,那么只需进行n-1次排序,因为最后一个元素自动就位

***因为选择排序是把最值放在数组的前面,所以选择的元素下标是a+1,为了保证最后一个元素参与了比较,所以第二个循环c<n

代码:

cpp 复制代码
#include <stdio.h>

void xuanze(int num[],int n)
{
    for(int a=0;a<n-1;a++)
    {
       int b=a;
           for(int c=a+1,c<n;c++)
            {  
              if(num[b]>num[c])
               b=c;
            }
       int temp=num[a];
       num[a]=num[b];
       num[b]=temp;
    }
}

void prinxuan(int num[],n)
{
   for(int a=0;a<=n-1;a++)
    printf("%d",num[a];
}
              
          

int mian()
{
   int num[]={2,10,4,9};
   int n=sizeof(num)/sizeof(num[0]);
   xuanze(num,n);
   prinxuan(num,n);
}

代码解析:

1.xuanze函数是一个将数组进行选择排序的函数

prinxuan函数是一个打印数组的函数

2.n是指数组中的元素的个数

所以选择排序只需进行n-1个排序

3.因为选择排序选择的数是根据排序次数来递进的,所以每个标准数要从c=a+1开始

相关推荐
星环科技7 分钟前
数据标准Agent ,让企业数据说同一种语言
java·开发语言·前端
凌波粒11 分钟前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode
凌波粒20 分钟前
LeetCode--46.全排列(回溯算法)
数据结构·算法·leetcode
dadaobusi22 分钟前
RISC-V 虚拟化:虚拟机TLB处理
java·开发语言
夏幻灵22 分钟前
深度解析 JavaScript 异步编程:从回调地狱到 Promise 的重构
开发语言·javascript·重构
鱼子星_25 分钟前
C++从零开始系列篇(二):C++入门——函数重载,引用,inline与nullptr
开发语言·c++·笔记
程序猿乐锅32 分钟前
【 苍穹外卖day03 | 菜品管理 】
java·开发语言·数据库·mysql
派大鑫wink32 分钟前
Java 高级编程技巧(生产级实用,覆盖性能、并发、设计、JVM、语法、避坑)
开发语言·python
JSON_L33 分钟前
PHP实现大文件分片上传
开发语言·php
凤山老林35 分钟前
JDK 11 升级至 JDK 17
java·开发语言·jdk17·jdk升级·jdk11