1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_selection_sort_f32.c
4  * Description:  Floating point selection sort
5  *
6  * $Date:        23 April 2021
7  * $Revision:    V1.9.0
8  *
9  * Target Processor: Cortex-M and Cortex-A cores
10  * -------------------------------------------------------------------- */
11 /*
12  * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
13  *
14  * SPDX-License-Identifier: Apache-2.0
15  *
16  * Licensed under the Apache License, Version 2.0 (the License); you may
17  * not use this file except in compliance with the License.
18  * You may obtain a copy of the License at
19  *
20  * www.apache.org/licenses/LICENSE-2.0
21  *
22  * Unless required by applicable law or agreed to in writing, software
23  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
24  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25  * See the License for the specific language governing permissions and
26  * limitations under the License.
27  */
28 
29 #include "arm_sorting.h"
30 
31 /**
32   @ingroup groupSupport
33  */
34 
35 /**
36   @addtogroup Sorting
37   @{
38  */
39 
40 /**
41    * @private
42    * @param[in]  S          points to an instance of the sorting structure.
43    * @param[in]  pSrc       points to the block of input data.
44    * @param[out] pDst       points to the block of output data
45    * @param[in]  blockSize  number of samples to process.
46    *
47    * @par        Algorithm
48    *               The Selection sort algorithm is a comparison algorithm that
49    *               divides the input array into a sorted and an unsorted sublist
50    *               (initially the sorted sublist is empty and the unsorted sublist
51    *               is the input array), looks for the smallest (or biggest)
52    *               element in the unsorted sublist, swapping it with the leftmost
53    *               one, and moving the sublists boundary one element to the right.
54    *
55    * @par          It's an in-place algorithm. In order to obtain an out-of-place
56    *               function, a memcpy of the source vector is performed.
57    */
58 
arm_selection_sort_f32(const arm_sort_instance_f32 * S,float32_t * pSrc,float32_t * pDst,uint32_t blockSize)59 void arm_selection_sort_f32(
60   const arm_sort_instance_f32 * S,
61         float32_t * pSrc,
62         float32_t * pDst,
63         uint32_t blockSize)
64 {
65     uint32_t i, j, k;
66     uint8_t dir = S->dir;
67     float32_t temp;
68 
69     float32_t * pA;
70 
71     if(pSrc != pDst) // out-of-place
72     {
73         memcpy(pDst, pSrc, blockSize*sizeof(float32_t) );
74         pA = pDst;
75     }
76     else
77         pA = pSrc;
78 
79     /*  Move the boundary one element to the right */
80     for (i=0; i<blockSize-1; i++)
81     {
82         /* Initialize the minimum/maximum as the first element */
83         k = i;
84 
85         /* Look in the unsorted list to find the minimum/maximum value */
86         for (j=i+1; j<blockSize; j++)
87         {
88             if (dir==(pA[j] < pA[k]) )
89             {
90                 /* Update value */
91                 k = j;
92             }
93         }
94 
95         if (k != i)
96         {
97             /* Swap the minimum/maximum with the leftmost element */
98             temp=pA[i];
99 	    pA[i]=pA[k];
100 	    pA[k]=temp;
101         }
102     }
103 }
104 
105 /**
106   @} end of Sorting group
107  */
108