当前位置: 首页 > article >正文

嵌入式C语言之快速排序方法实现原理

目录

概述

1.  快速排序原理介绍

2 代码实现

2.1 代码功能介绍

2.2 源代码文件

3 功能测试

3.1  代码实现

3.2 测试


概述

本文主要介绍嵌入式C语言之快速排序方法实现原理,并编写源代码实现了快速排序的功能,并编写测试代码验证该函数的功能。

1.  快速排序原理介绍

快速排序的核心思想是分治法,其目的是将一个大的问题划分成若干小的问题,通过采取函数递归的方式以实现数值的快速排序。

具体事项步骤如下:

1)选择数组中的元素e作为分割元素,然后重新排列数组,其排列要求如下:

1)数据 value <= e:  排列在一边

2)数据 value >= e:  排列在另一边


举一个例子:

取第一个数据 e = 12, 经过第一次循环后,数据如下:

原始数据:        12 5 8 1 6 4 7 3 9 20 0 10

排序后的数组: 10 5 8 1 6 4 7 3 9 0 12 20

2)通过递归的方法调用快速方法,对从1 ~ i+1的元素进行排序

3)通过递归的方法调用快速方法,对从i+ ~n的元素进行排序

 完成以上步骤之后,i左边的数据都小余或者等于e, 右边的数据都大于或者等于e。

2 代码实现

2.1 代码功能介绍

代码22行: 将index = low 位置的元素作为分割点

代码27~30行: 从最高index位找大于index = low位置的元素

代码34行:  保存当前大于index = low位置的元素

代码38~41行:从index+1的位置开始找大于index = low位置的元素

代码46行:  保存当前小于index = low位置的元素

代码49行: 保存分割点的值

代码61行: 分割当前数组

代码62行:调用当前函数的递归函数,重新进行排序,排序范围: low ~ middle -1

代码63行:调用当前函数的递归函数,重新进行排序,排序范围: middle +1 ~ high

2.2 源代码文件

int split( int buff[], int low, int high )
{
    int part_element = buff[low]; 
    
    for (;;)
    {
        // 将小的数据移动到左边 
        while( low < high && part_element <= buff[high] )
        {
            high--;
        }
        
        if( low >= high )
            break;
        buff[low++] = buff[high];
        
        
        // 将大的数据移动到右边 
        while( low < high && buff[low] <= part_element )
        {
            low++;
        }
        
        if( low >= high )
            break;
        
        buff[high--] = buff[low];
    }
    
     buff[high] = part_element;
    
     return high;
}

void quicksort( int buff[], int low, int high )
{
    int middle;
    
    if( low >= high)
        return;
    
    middle = split( buff, low, high );
    quicksort( buff, low, middle-1);
    quicksort( buff, middle+1, high);
}

3 功能测试

3.1  代码实现

定义一个数组,对其进行快速排序,以验证快速排序的算法功能。

代码68~69行: 定义一个测试数组

代码71~78行: 定义打印log函数

代码80~97行: 测试排序函数的功能

源代码文件:

#define LEN      12
int t_buff[LEN] = {5,11,8,1,6,4,7,15,9,3,0,10};

void printf_log( int buff[], int len )
{
    for ( int i = 0; i <LEN; i++ )
    {
       printf("%d ", buff[i]);
    }
    printf("\r\n");
}

void test_sort( void )
{
    int high;
    int len = LEN-1; 
    
    printf_log( t_buff, len);
    printf("\r\n");
    
    high = split( t_buff, 0, len);
    printf_log( t_buff, len);
    printf("\r\n");
    
    printf("high = %d \r\n", len);
    
    quicksort(t_buff, 0, len);
    printf_log( t_buff, len);
    printf("\r\n");
}

3.2 测试

运行代码之后,终端会得到如下log:

原始数组中的数据:

5 11 8 1 6 4 7 15 9 3 0 10


经过第一次分割之后的数据:

0 3 4 1 5 6 7 15 9 8 11 10


排序后的最终结果:

0 1 3 4 5 6 7 8 9 10 11 15


http://www.kler.cn/a/554610.html

相关文章:

  • 用LightRAG+智谱GLM-4提升政务对话精度:从知识图谱到精准问答的实战指南
  • AI前端开发:拥抱未来,规划职业新高度
  • Unix-进程
  • 深入理解WebSocket接口:如何使用C++实现行情接口
  • C++ STL中的reverse/unique/sort/lower_bound/upper_bound函数使用
  • 上海市计算机学会竞赛平台2025年1月月赛丙组音乐播放
  • 机器学习_12 逻辑回归知识点总结
  • 【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct
  • 【QT】第一个 QT程序(对象树)
  • Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
  • UEFI Spec 学习笔记---9 - Protocols — EFI Loaded Image
  • [特殊字符]边缘计算课程资料整理|从零到实战全攻略[特殊字符]
  • 【Linux】【网络】不同子网下的客户端和服务器通信
  • 爬虫FirstDay01-Request请求模块详解
  • 网易严选DevOps实践:从传统到云原生的演进
  • 如何利用ArcGIS Pro打造萤火虫风格地图
  • 二叉树层序遍历的三种情况(总结)
  • 蓝桥杯备考:递归初阶
  • Vue.js Vue 测试工具:Vue Test Utils 与 Jest
  • 学习threejs,THREE.Material材质基类详解