说明:本函数是基于海思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