# How to sort the array using the choice method in C?

The code:

#include <stdio.h>
int main()
{
float a={2,6,7.5,4.1,5,2.3,6.2,3,1.5,4.9,0.3,12,3,14,1.4};
int max=0;
float buf=0;
for(int i=0;i<15;i++){
max=i;
for(int j=i+1;j<15;j++){
if(a[j]>a[max]){
max=j;
}
if(i!=max){
buf=a[i];
a[i]=a[max];
a[max]=buf;
}

}
}
for(int i=0;i<15;i++){
printf("%.1f ", a[i]);
}
return 0;
}

The result: 7.5 6.2 5.0 6.0 4.1 3.0 12.0 4.9 3.0 2.3 2.0 1.5 1.4 14.0 0.3.

As you can see, it's not what I want/

+1 vote
answered Dec 4, 2020 by (80,300 points)
selected Dec 4, 2020 by Natalia

# My Solution

I'm not 100% sure what you mean by "sort the array using the choice method".

I guess what you mean is the Selection Sort algorithm.

Someone else was doing all kind of sorting algorithms and I did my own version for him. You can find various sorting algorithms implemented here.

I'll put the Selection Sort down here as well:

```void SelectionSort(int a[], int size)
{
for (int i = 0; i < size - 1; i++)
{
int min = i;
for (int j = i + 1; j < size; j++)
{
if (a[min] > a[j])
min = j;
}
Swap(a[i], a[min]);
}
}```

You'll have to do a bit of work as my code works with integral numbers. You need to change it here and there to work with floats instead. After that you have to do call this method where you want to sort your array.

## The Problems

### Wrong Formatting

Your code is a bit hard to read as indentations are a bit messy. You should really stick to the same indentation for every level of the code.
See how the "if(i!=max){" is indented more than "if(a[j]>a[max]){", although they should be on the same level?

### Swapping In Every Step

Your code swap the value of the maximum an the ith index in every iteration of the for j loop. This piece of code should be outside of this loop, in the for i loop.

## The Fix

Below is your code reformatted and the swap logic moved to the right place:
```#include <stdio.h>

int main()
{
float a = { 2, 6, 7.5, 4.1, 5, 2.3, 6.2, 3, 1.5, 4.9, 0.3, 12, 3, 14, 1.4 };
int max = 0;
float buf = 0;
for (int i = 0; i < 15; i++)
{
max = i;
for (int j = i + 1; j < 15; j++)
{
if (a[j] > a[max])
{
max=j;
}
}

if (i != max)
{
buf = a[i];
a[i] = a[max];
a[max] = buf;
}
}

for (int i = 0; i < 15; i++)
{
printf("%.1f ", a[i]);
}
return 0;
}```
commented Dec 4, 2020 by (1,080 points)
Thank you Peter! Now I understand this algorithm much better)))