给一串数据按从大到小排序

说明:本函数是基于海思NNIE示例改写,作为验证理解之用

思想:从数组两端开始比较,(先取数组首地址的数据,与末尾地址数据比较)

(1)设计两个指针,分别为 前向地址指针,后向地址指针

(2)设计Sort_STACK_S堆栈区,存储大数据分区和小数据分区

步骤大循环A中嵌套小循环B

循环B:

        1.首末端开始比较,末端数据大则互换,如末端不大,则末端地址指针-1(向前偏移),直至找到比该数据大的数,然后互换,(注意前向和后向地址指针位置比较),每次互换,前向指针+1(向后偏移),此时该数在后面

        2.再用该数与前向数据比较,前向数据大则前向指针+1(前向指针向后偏移),如遇前向数据小则互换,后向指针-1(向前偏移)此时该数在前面

        3.经过多次循环后就会形成分区,该数据前面的都是大于该数的数据,该数据后面部分都是小于该数的数据,第一次大循环A就会形成两个分区,注意,该数据永远在此位置保持不变,后续分别按照大数据区和小数据区比较,言外之意,使该数在数组中找到属于自己的位置并以此处作为临界点

循环A:

Sort_STACK_S作用就是用来存储分区的首部和尾部指针,下次的大循环按照分区再重复执行一次循环B,直至Sort_STACK_S中的分区执行完毕,从大到小排序完成

验证代码如下:

/*
 ============================================================================
 Name        : quick_sort.c
 Author      : yxt
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
typedef struct hiSVP_SAMPLE_STACK_S {
    int     HI_S32Min;
    int     HI_S32Max;
} Sort_STACK_S;
static int array[7]={10, 3, 8, 7, 16, 2, 12};

int BoxArgswap(int* pstBox1, int* pstBox2)
{
    // check
    int stBoxTmp = 0;

    memcpy(&stBoxTmp, pstBox1, sizeof(stBoxTmp));
    memcpy(pstBox1, pstBox2, sizeof(stBoxTmp));
    memcpy(pstBox2, &stBoxTmp, sizeof(stBoxTmp));

    return 0;
}
Sort_STACK_S Sort_Stack[80]  ;

/*
 * 对预测出的边界框得分排序
 * 取出每一类得分大于一定阈值的框和得分进行排序
 */
int QuickSort(int* pstBoxs, int HI_S32Low, int HI_S32High, Sort_STACK_S *pstStack)
{
    int l;
    int i = HI_S32Low; //检测结果的索引,从0开始
    int j = HI_S32High; //检测结果的最大索引,最大数目-1
    int HI_S32Top = 0;

    pstStack[HI_S32Top].HI_S32Min = HI_S32Low;   //0
    pstStack[HI_S32Top].HI_S32Max = HI_S32High;  //(TotalNum1+TotalNum2+TotalNum3 )- 1

    int f32KeyConfidence = pstBoxs[HI_S32Low] ;
     printf("f32KeyConfidence=%d \n", f32KeyConfidence );
//    for(l = 0 ; l < 7;l++)
//    {
//        printf("pstBoxs=%d ", pstBoxs[l]);
//
//    }
//    printf("\n");
    printf(" HI_S32Min=%d ,HI_S32Max=%d , HI_S32Top=%d \n",  pstStack[HI_S32Top].HI_S32Min, pstStack[HI_S32Top].HI_S32Max , \
            HI_S32Top );

    while (HI_S32Top > -1)//依次处理
    {
        //-------------------------//
        printf(" first ");
        for(l = 0 ; l < 7;l++)
        {
            printf(" pstBoxs0=[%d] ", pstBoxs[l]);

        }
        printf("\n");

        //-------------------------//
        //{0~6},{3~6},{5~6}
        HI_S32Low = pstStack[HI_S32Top].HI_S32Min; //0,3
        HI_S32High = pstStack[HI_S32Top].HI_S32Max;//(TotalNum1+TotalNum2+TotalNum3 )- 1,6
        i = HI_S32Low; //0 , 3
        j = HI_S32High;//6 , 6
        HI_S32Top--; //0 ; -1

        printf("HI_S32Low=%d ,HI_S32High=%d ,i=%d,j=%d , HI_S32Top=%d \n", HI_S32Low, HI_S32High , \
                i,j ,HI_S32Top);

       f32KeyConfidence = pstBoxs[HI_S32Low] ; // HI_S32Low=0
       printf("f32KeyConfidence =%d \n ", f32KeyConfidence);
        while (i < j)
        {
            while ( (i < j) && (f32KeyConfidence > pstBoxs[j] ) )
            {
                j--;
            }
            if (i < j) //i = 0
            {
                BoxArgswap(&pstBoxs[i], &pstBoxs[j]); //swap place
                i++;
            }
            //-------------------------//
            for(l = 0 ; l < 7;l++)
            {printf("a0[%d]=%d ", l,pstBoxs[l]); } printf("\n");
             printf("i0=%d , j0=%d \n\n ", i , j);
            //-------------------------//
            while ((i < j) && (f32KeyConfidence < pstBoxs[i] ))
            {
                i++;
            }
            if (i < j)
            {
                BoxArgswap(&pstBoxs[i], &pstBoxs[j]);
                j--;
            }
            //-------------------------//
            for(l = 0 ; l < 7;l++)
            {printf("a1[%d]=%d ", l,pstBoxs[l]);} printf("\n");
             printf("i1=%d , j1=%d \n\n ", i , j);
            //-------------------------//
            printf("--------------------------\n");
        }//while (i < j)
        //
        if (HI_S32Low < i - 1)//0<2-1
        {
            HI_S32Top++;//0
            pstStack[HI_S32Top].HI_S32Min = HI_S32Low; //0
            pstStack[HI_S32Top].HI_S32Max = i - 1;     //1
        }

        if (HI_S32High > i + 1)//6>2+1
        {
            HI_S32Top++;//1
            pstStack[HI_S32Top].HI_S32Min = i + 1;      //2+1
            pstStack[HI_S32Top].HI_S32Max = HI_S32High; //6
        }

    } //   while (HI_S32Top > -1)

    return 0;
}
int main(void) {
//    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    QuickSort(&array[0] ,0 , 6 ,Sort_Stack );
    int l;
    for(l = 0 ; l < 7;l++)
    {
        printf("array=%d ", array[l]);

    }

    return EXIT_SUCCESS;
}
 

例程示例数据打印如下:

f32KeyConfidence=10 
 HI_S32Min=0 ,HI_S32Max=6 , HI_S32Top=0 
 first  pstBoxs0=[10]  pstBoxs0=[3]  pstBoxs0=[8]  pstBoxs0=[7]  pstBoxs0=[16]  pstBoxs0=[2]  pstBoxs0=[12] 
HI_S32Low=0 ,HI_S32High=6 ,i=0,j=6 , HI_S32Top=-1 
f32KeyConfidence =10 
 a0[0]=12 a0[1]=3 a0[2]=8 a0[3]=7 a0[4]=16 a0[5]=2 a0[6]=10 
i0=1 , j0=6 

 a1[0]=12 a1[1]=10 a1[2]=8 a1[3]=7 a1[4]=16 a1[5]=2 a1[6]=3 
i1=1 , j1=5 

 ----------loop B----------------
a0[0]=12 a0[1]=16 a0[2]=8 a0[3]=7 a0[4]=10 a0[5]=2 a0[6]=3 
i0=2 , j0=4 

 a1[0]=12 a1[1]=16 a1[2]=10 a1[3]=7 a1[4]=8 a1[5]=2 a1[6]=3 
i1=2 , j1=3 

 ----------loop B----------------
a0[0]=12 a0[1]=16 a0[2]=10 a0[3]=7 a0[4]=8 a0[5]=2 a0[6]=3 
i0=2 , j0=2 

 a1[0]=12 a1[1]=16 a1[2]=10 a1[3]=7 a1[4]=8 a1[5]=2 a1[6]=3 
i1=2 , j1=2 

 ----------loop B----------------
----------loop A----------------
 first  pstBoxs0=[12]  pstBoxs0=[16]  pstBoxs0=[10]  pstBoxs0=[7]  pstBoxs0=[8]  pstBoxs0=[2]  pstBoxs0=[3] 
HI_S32Low=3 ,HI_S32High=6 ,i=3,j=6 , HI_S32Top=0 
f32KeyConfidence =7 
 a0[0]=12 a0[1]=16 a0[2]=10 a0[3]=8 a0[4]=7 a0[5]=2 a0[6]=3 
i0=4 , j0=4 

 a1[0]=12 a1[1]=16 a1[2]=10 a1[3]=8 a1[4]=7 a1[5]=2 a1[6]=3 
i1=4 , j1=4 

 ----------loop B----------------
----------loop A----------------
 first  pstBoxs0=[12]  pstBoxs0=[16]  pstBoxs0=[10]  pstBoxs0=[8]  pstBoxs0=[7]  pstBoxs0=[2]  pstBoxs0=[3] 
HI_S32Low=5 ,HI_S32High=6 ,i=5,j=6 , HI_S32Top=0 
f32KeyConfidence =2 
 a0[0]=12 a0[1]=16 a0[2]=10 a0[3]=8 a0[4]=7 a0[5]=3 a0[6]=2 
i0=6 , j0=6 

 a1[0]=12 a1[1]=16 a1[2]=10 a1[3]=8 a1[4]=7 a1[5]=3 a1[6]=2 
i1=6 , j1=6 

 ----------loop B----------------
----------loop A----------------
 first  pstBoxs0=[12]  pstBoxs0=[16]  pstBoxs0=[10]  pstBoxs0=[8]  pstBoxs0=[7]  pstBoxs0=[3]  pstBoxs0=[2] 
HI_S32Low=0 ,HI_S32High=1 ,i=0,j=1 , HI_S32Top=-1 
f32KeyConfidence =12 
 a0[0]=16 a0[1]=12 a0[2]=10 a0[3]=8 a0[4]=7 a0[5]=3 a0[6]=2 
i0=1 , j0=1 

 a1[0]=16 a1[1]=12 a1[2]=10 a1[3]=8 a1[4]=7 a1[5]=3 a1[6]=2 
i1=1 , j1=1 

 ----------loop B----------------
----------loop A----------------
array=16 array=12 array=10 array=8 array=7 array=3 array=2 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值