嵌入式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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值