自定义各类基础排序算法

接口函数基础信息

/*******************************************************************
 *
 *	文件名称  :	数据结构中对于无序数列的排序算法
 *	文件作者  : mailLinL@163.com
 *	创建日期  :  2024/05/11
 *	文件功能  :  对无序数列进行排序
 *	注意事项  :  None
 *
 *	CopyRight (c)  2024   mailLinL@163.com   All Right Reseverd
 *
 * *****************************************************************/

头文件包含

#include <stdio.h>

插入排序法

将一个数组假想为两个数组,一个是有序数组,一个是无序数组。将无序数组中的一个元素依次与有序数组中的元素进行对比,直到比当前元素大,由于比较的同时需要将有序数组中元素后移,一般从有序数组的最后开始比较,当比较到有序数组首元素仍未找到,则将该元素插入有序序列首部

/*******************************************************************
 *
 *	函数名称:	InsertSort
 *  函数功能:   插入排序法 把无序序列元素一次插入有序序列
 *  函数参数:
 *              @buf        传入有序序列
 *              @bufsize    待插入的元素
 *	返回结果:
 *	注意事项:   None
 *	函数作者:   mailLinL@163.com
 *	创建日期:   2024/05/11
 *	修改历史:
 *	函数版本:	V1.0
 * *****************************************************************/
// 插入排序 是把无序序列中元素依次插入到有序序列中,一般是从有序序列的尾部开始比较
void InsertSort(int buf[], int bufsize)
{
    int temp = 0;         // 用于备份当前待插入元素的值
    int current_prev = 0; // 备份待插入元素的下标

    // 1.可以假设把数组中的第一个元素作为有序序列的元素,剩下的元素作为无序序列
    for (int i = 1; i < bufsize; ++i)
    {
        // 2.先备份当前待插入元素的值
        temp = buf[i];

        // 3.把当前待插入元素和有序序列中的元素依次进行比较,从有序序列尾部开始
        for (int j = i - 1; j >= 0; j--)
        {
            // 当前待插入元素的值 小于 待插入元素的直接前驱的元素的值
            if (temp < buf[j])
            {
                current_prev = j;    // 备份当前待插入元素的直接前驱的下标
                buf[j + 1] = buf[j]; // 后移
            }
            else
            {
                current_prev = j + 1;
                break;
            }
        }

        // 4.把待插入元素插入到指定位置
        buf[current_prev] = temp;
    }
}

冒泡排序(升序)

从无序序列中取第一个元素依次向后比较,该元素比后面的元素小时,记录后面的元素,再向后进行比较,每轮确定一个最大值放在无序序列的尾部。

/*******************************************************************
 *
 *	函数名称:	bubbleSort
 *  函数功能:   冒泡排序 元素两两之间进行比较交换
 *  函数参数:
 *              @buf        传入无序序列
 *              @bufsize    待插入的元素
 *	返回结果:
 *	注意事项:   None
 *	函数作者:   mailLinL@163.com
 *	创建日期:   2024/05/11
 *	修改历史:
 *	函数版本:	V1.0
 * *****************************************************************/
// 冒泡排序 ,指的是元素两两之间进行比较交换,需要比较n轮,每轮需要比较m次,从左向右升序
void bubbleSort(int buf[], int bufsize)
{

    int temp = 0; // 为了临时存储交换值

    // 1.循环比较元素,需要比较n轮
    for (int n = 1; n < bufsize; ++n)
    {
        // 2.每轮需要比较m次
        for (int m = 0; m < bufsize - n; ++m)
        {
            // 3.数组元素两两之间进行比较交换 buf[0] buf[1]   buf[1] buf[2]
            if (buf[m] > buf[m + 1])
            {
                temp = buf[m];       // 备份前一个
                buf[m] = buf[m + 1]; // 把后面交换到前面
                buf[m + 1] = temp;   // 把前面交换到后面
            }
        }
    }
}

选择排序

定义一个无序序列中元素数据类型的变量临时储存序列中的最小元素的值,以及一个整型变量记录该元素的下标,临时记录无序序列的第一个元素的值,当遍历比较时,有某个元素的值小于临时变量的值时,把该元素的值赋值给临时变量并记录其下标,直到比较完所有元素。然后将序列第一个元素存入最小值下标中,再将最小值赋值首元素,循环到所有元素完成排序

/*******************************************************************
 *
 *	函数名称:	SelectSort
 *  函数功能:   选择排序  从序列中找最小值元素,放在整个序列的首部
 *  函数参数:
 *              @buf    传入无序序列的
 *              @size   无序序列的容量
 *	返回结果:
 *	注意事项:   None
 *	函数作者:   mailLinL@163.com
 *	创建日期:   2024/05/11
 *	修改历史:
 *	函数版本:	V1.0
 * *****************************************************************/
// 选择排序  从序列中找到一个最小值元素,把最小值元素放在整个序列的首部,重复n轮,直到整个序列有序
void SelectSort(int buf[], int size)
{
    int min = 0;  // 记录最小值元素的下标
    int temp = 0; // 备份最小值元素的值

    // 需要比较n轮,每轮找到序列中的最小值元素
    for (int n = 0; n < size - 1; ++n)
    {
        min = n; // 假设每轮序列中的第一个元素是最小值元素

        // 找到序列中的最小值元素的下标
        for (int i = n + 1; i < size; ++i)
        {
            // 每轮需要通过比较的方式才可以确定最小值
            if (buf[min] > buf[i])
            {
                min = i; // 更新当前的最小值元素的下标
            }
        }

        // 找到最小值元素,需要把最小值元素和序列的首部元素进行交换
        temp = buf[min];
        buf[min] = buf[n];
        buf[n] = temp;
    }
}

计数排序

从无序序列中取一个元素,和其他元素进行对比,记录比该元素小的元素个数,比较完成后把个数作为新序列中该元素的下标存入其中,直到完成所有元素的写入。

/*******************************************************************
 *
 *	函数名称:	CountSort
 *  函数功能:   计数排序,统计数组A中比每个元素小的元素个数,作为有序数值该元素的下标
 *  函数参数:
 *              @A          传入无序序列的
 *              @B          传入记录有序序列的数组地址
 *              @bufsize    无序序列的容量
 *	返回结果:
 *	注意事项:   None
 *	函数作者:   mailLinL@163.com
 *	创建日期:   2024/05/11
 *	修改历史:
 *	函数版本:	V1.0
 * *****************************************************************/
// 计数排序,统计数组A中比每个元素小的元素个数,并把该个数作为数组B的下标
void CountSort(int A[], int B[], int size)
{
    int cnt = 0; // 记录个数

    for (int n = 0; n < size; ++n)
    {
        cnt = 0; // 计数器清0

        // n作为数组A的元素下标
        for (int i = 0; i < size; ++i)
        {
            if (A[i] < A[n])
            {
                cnt++;
            }
        }

        B[cnt] = A[n];
    }
}

在主函数中自定义无序序列,调用函数测试

int main(int argc, char const *argv[])
{

    // 定义一个整型数组存储10个整数
    int buf1[9] = {14, 23, 12, 5, 8, 3, 9, 10, 33};
    int buf2[9] = {14, 23, 12, 5, 8, 3, 9, 10, 33};
    int buf3[9] = {14, 23, 12, 5, 8, 3, 9, 10, 33};
    int buf4[9] = {14, 23, 12, 5, 8, 3, 9, 10, 33};
    int buf5[9] = {0};
    InsertSort(buf1, 9);
    bubbleSort(buf2, 9);
    SelectSort(buf3, 9);
    CountSort(buf4, buf5, 9);
    for (int i = 0; i < 9; i++)
    {
        printf("%3d", buf1[i]);
        printf("%3d", buf2[i]);
        printf("%3d", buf3[i]);
        printf("%3d", buf5[i]);
        printf("\n");
    }

    return 0;
}

测试结果

image

posted @   林大官人995  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示