首页 > 编程语言 >C语言实现排序之冒泡排序算法

C语言实现排序之冒泡排序算法

时间:2024-05-29 22:30:52浏览次数:24  
标签:int 复杂度 冒泡排序 C语言 数组 array 排序 size

1.代码

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

// 函数声明
// 创建并生成一个包含随机数的数组,数组大小由参数size指定
int* create_and_generate_random_array(int size);
// 打印数组内容,参数array是数组指针,size是数组大小
void print_array(int *array, int size);
// 对数组进行冒泡排序,参数array是数组指针,size是数组大小
void bubble_sort(int *array, int size);

int main() {
    int size = 10000; // 数组大小设为10000
    int *array = create_and_generate_random_array(size); // 创建并生成随机数组

    if (array == NULL) {
        // 如果内存分配失败,打印错误信息并返回1
        printf("Memory allocation failed\n");
        return 1;
    }

    // 打印原始数组
    // printf("Original array:\n");
    // print_array(array, size);

    // 获取排序开始时间
    clock_t start_time = clock();

    // 对数组进行冒泡排序
    bubble_sort(array, size);

    // 获取排序结束时间
    clock_t end_time = clock();

    // 计算排序执行时间并转换为毫秒
    double execution_time = ((double)(end_time - start_time) / CLOCKS_PER_SEC) * 1000;

    // 打印排序后的数组
    // printf("Sorted array:\n");
    // print_array(array, size);

    // 打印执行时间
    printf("Execution time: %.2f ms\n", execution_time);

    // 释放分配的内存
    free(array);

    return 0;
}

// 创建并生成包含随机数的数组,返回指向该数组的指针
int* create_and_generate_random_array(int size) {
    // 使用malloc函数动态分配内存,sizeof(int)计算单个整型变量的字节数,
    // 乘以size得到整个数组需要的总字节数。
    // malloc返回一个void指针,这里通过类型转换(int *)来将其转换为int类型的指针。
    int *array = (int *)malloc(sizeof(int) * size);
    if (array == NULL) {
        // 如果内存分配失败,返回NULL
        return NULL;
    }

    // 使用当前时间作为随机数种子
    srand(time(NULL));
    // 生成随机数组,数组元素为0到999之间的随机数
    for (int i = 0; i < size; i++) {
        //rand()一个介于 0 和 RAND_MAX 之间的整数。RAND_MAX 是一个常量,通常定义为 32767。
        array[i] = rand() % 1000;
    }

    return array; // 返回数组指针
}

// 打印数组内容
void print_array(int *array, int size) {
    for (int i = 0; i < size; i++) {
        // 打印数组的每个元素
        printf("%d ", array[i]);
    }
    printf("\n");
}

// 冒泡排序算法
void bubble_sort(int *array, int size) {
    // 外层循环控制排序轮数,共size-1轮
    for (int i = 0; i < size - 1; i++) {
        // 内层循环进行相邻元素的比较和交换
        for (int j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                // 如果前一个元素大于后一个元素,交换它们的位置
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

2.分析

/*
 * 冒泡排序(Bubble Sort)的时间复杂度和稳定性如下:

### 时间复杂度

冒泡排序的时间复杂度可以分为以下几种情况:

1. **最佳情况(Best Case)**:
   - 当数组已经是有序的情况下,冒泡排序只需进行一次遍历即可。每次遍历时,没有元素交换,所以最佳情况时间复杂度为 O(n)。
   - 这个情况只有在算法中包含一个检测排序完毕的标志时才有效,即如果在某一趟中没有进行任何交换操作,则可以提前终止排序过程。

2. **最坏情况(Worst Case)**:
   - 当数组是反序的情况下,冒泡排序需要进行 n-1 趟完整的比较和交换。最坏情况时间复杂度为 O(n^2)。

3. **平均情况(Average Case)**:
   - 在所有可能的排列情况下,冒泡排序的时间复杂度是 O(n^2)。

### 空间复杂度

冒泡排序的空间复杂度为 O(1),因为它是原地排序算法,不需要额外的存储空间。

### 稳定性

冒泡排序是**稳定**的排序算法。稳定性指的是在排序过程中,两个相等的元素的相对顺序不会改变。由于冒泡排序在交换时只涉及相邻元素,所以相同的元素不会被交换,从而保持了它们的相对顺序。

### 总结

- **时间复杂度**:
  - 最佳情况: O(n)
  - 最坏情况: O(n^2)
  - 平均情况: O(n^2)
- **空间复杂度**: O(1)
- **稳定性**: 稳定

冒泡排序虽然简单易懂,但由于其最坏和平均情况下的时间复杂度为 O(n^2),在处理大规模数据时性能较差,因此在实际应用中较少使用,更多是用于教学和理解排序算法的基础概念。
 */

标签:int,复杂度,冒泡排序,C语言,数组,array,排序,size
From: https://blog.csdn.net/2403_83044722/article/details/139280621

相关文章

  • C语言实现排序之选择排序算法
    1.代码#include<stdlib.h>#include<stdio.h>#include<time.h>//函数声明int*create_and_generate_random_array(intsize);voidprint_array(int*array,intsize);voidselection_sort(int*array,intsize);intgenerate_random_size();intm......
  • C语言学习——程序中的辅助语句,C语言中的常量
    目录一、程序中的辅助语句1.C语言中的注释2.赋值语句3.三目运算符4.逗号表达式5.自增(++)与自减(--)运算符6.goto语句二、C语言中的常量1.程序中常量的概念2.C语言中的常量类型3.常量定义的语法4.C语言中的只读变量 一、程序中的辅助语句1.C语言中的注释—注释......
  • 指针(2),迭代,快速排序,单词倒置
    指针运算:& * +N-Np++ //往后跳了一个元素 p-- //往前一个元素 p-q //相同类型的指针减出的来的结果为,地址之间相差的元素个数 关系运算:p>q  p<q >>=<<=!= 迭代:迭代其实就是一种特殊的循环,迭代根据上一次循环得到的运算结果来进行下......
  • linux 查看csv文件,按指定列聚合 排序
    在Linux中,你可以使用awk工具来查看CSV文件的内容,并按照指定的列进行聚合。awk是一种强大的文本处理工具,它可以处理文本文件中的数据,并根据条件执行相应的操作。以下是一个示例,假设你有一个名为data.csv的CSV文件,其中包含三列数据:姓名、年龄和性别,内容如下:姓名,年龄,性别张......
  • C语言转移表的三种方法
    一、一般实现转移表转移表–>计算机的实现首先说明,本次的代码,最主要是用函数的调用,实现计算机的功能。一般实现的计算机的思路和猜数字游戏的思路差不多。思路如下,首先设置入口:intinput=1;,用do-while循环和switch语句,设置菜单,选择进入或者不进入;然后调用函数,计算结......
  • C语言题目要求实现方法总结(1-10)
    目录一、互换A,B的值1.1使用中间变量1.2使用异或^(不允许创建中间变量)1.3使用函数(指针传参)二、按降序输出A,B的值2.1直接实现2.2使用指针三、找出最大值3.1遍历数组先输入再找(常规)边输入边找(改进)其实把数组优化掉也不是不可以(偷懒法,不够通用,第一个常规法......
  • 【C语言】for循环
    简介在C语言中,for循环是一种常用的控制结构,用于重复执行一段代码多次。for循环包括三个部分:初始化表达式、循环条件和更新表达式。for循环的语法如下:for(初始化表达式;循环条件;更新表达式){//循环体}初始化表达式在循环开始前被执行,通常用于设置计数器的初......
  • 排序(前篇)
    1.排序的概念及其运用2.插入排序的概念及实现3.希尔排序的概念及实现 4.选择排序概念及实现总代码(对比各个排序在大量的数据情况排序所化的时间):1.排序的概念及其运用1.1排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的......
  • C语言到底能干啥?我列举了8种经典案例
    虽然C语言执行速度极快,占用资源极少,但是它使用起来非常麻烦,完全没有Java、Python、Go、JavaScript、C#等方便和灵活,会严重拖慢项目的开发进度,所以,通常只有在“不得不”的情况下才会使用C语言。再说得直白点,就是我没得选了,我才会使用C语言。C语言的8种实际用途:1.开发操......
  • oracle的排序函数以及mysql使用变量实现排序
    oracle的排序函数rank()函数:跳跃排序,如果两个第一,则后边是第3dense_rank()函数:连续排序,,再如两个第一,则后边是第2row_number()函数:连续排序,没有并列的情况createtableccx_test( coursevarchar(10), scoreint);insertintoccx_testvalues(1,70);insertintoccx_......