0

I am trying to sort an array of integers using a selection sort algorithm, but some of the numbers aren't sorting. Below is the isolated section of my code that does the sorting and the output. Any suggestions?

#include <iostream>

using namespace std;

int main()
{
    int smallestIndex;
    int temp;
    
    int X[13] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9};
    
    for (int Index = 0; Index < 12; Index++) {
        smallestIndex = Index;
        for (int minIndex = Index+1; minIndex < 13; minIndex++) {
            if (X[minIndex] < X[smallestIndex]) {
                smallestIndex=minIndex;
            }
            if (smallestIndex != Index) {
                temp = X[Index];
                X[Index] = X[smallestIndex];
                X[smallestIndex] = temp;
            }
        }
    }
    
    for (int i = 0; i < 13; i++) {
        cout << X[i] << endl;
    }
}

output:

1                                                                  
2                                                                  
4                                                                  
7                                                                  
9                                                                  
3                                                                  
10                                                                 
8                                                                  
11                                                                 
12                                                                 
17                                                                 
18                                                                 
19
2
  • 1
    The programmer's secret weapon is the debugger. With a debugger you can run the program on your terms and watch what the program does as it does it. Step through the program and monitor the variables and flow of code. As soon as you catch the program doing something unexpected, you've found a bug. Finding the solution may take a bit more work, but finding the problem is a very important step in solving the problem. Commented Jul 24, 2020 at 20:31
  • 2
    You second if-statement doesn't want to be inside the nested loop. Commented Jul 24, 2020 at 20:35

1 Answer 1

1

There is an easier way to do this by using the swap() function, and using two more functions called, void selectionSort() and void printArray() to make the code look cleaner.

#include <iostream> 
#include <algorithm>

  
void swap(int *xp, int *yp)  
{  
    int temp = *xp;  
    *xp = *yp;  
    *yp = temp;  
}  
  
void selectionSort(int arr[], int n)  
{  
    int i, j, min_idx;  
  
    // One by one move boundary of unsorted subarray  
    for (i = 0; i < n-1; i++)  
    {  
        // Find the minimum element in unsorted array  
        min_idx = i;  
        for (j = i+1; j < n; j++)  
        if (arr[j] < arr[min_idx])  
            min_idx = j;  
  
       
        swap(&arr[min_idx], &arr[i]);  
    }  
}  
  

void printArray(int arr[], int size)  
{  
    int i;  
    for (i=0; i < size; i++)  
        std::cout << arr[i] << " ";  
    std::cout << std::endl;  
}  
  
 
int main()  
{  
    int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
    int n = sizeof(arr)/sizeof(arr[0]);  
    selectionSort(arr, n);  
    std::cout << "The sorted array is: \n";  
    printArray(arr, n);  
    return 0;  
}  

Output:

The sorted array is: 
1 2 3 4 7 8 9 10 11 12 17 18 19 

Another way you could do this is by just strictly using std::swap without the use of pointers. Make sure to include the #include<algorithm> header file for std::swap. You will also need to include #include <iterator> for std::size.

#include <iostream> 
#include <algorithm>
#include <iterator>
 
int main()
{
     int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
    constexpr int length{ static_cast<int>(std::size(arr)) };
    //constexpr means that value of a variable can appear in a constant expression.
 
    // Step through each element of the array
    
    for (int startIndex{ 0 }; startIndex < length - 1; ++startIndex)
    {
        
        int smallestIndex{ startIndex };
 
        // Then look for a smaller element in the rest of the array
        for (int currentIndex{ startIndex + 1 }; currentIndex < length; ++currentIndex)
        {
            if (arr[currentIndex] < arr[smallestIndex])
            
                smallestIndex = currentIndex;
        }
 
        
                // swap our start element with our smallest element 
        std::swap(arr[startIndex], arr[smallestIndex]);
    }
 
    // Now that the whole array is sorted, print it.
    for (int index{ 0 }; index < length; ++index)
        std::cout << arr[index] << ' ';
 
    std::cout << '\n';
 
    return 0;
}

You could also just use std::sort instead. It is in the header file #include<algorithm> which just sorts in ascending order by default. You will also need the header file #include <iterator> for std::size

#include <iostream> 
#include <algorithm>
#include <iterator> 
 
int main()
{
    int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
 
    std::sort(std::begin(arr), std::end(arr));
 
    for (int i{ 0 }; i < static_cast<int>(std::size(arr)); ++i)
        std::cout << array[i] << ' ';
 
    std::cout << '\n';
 
    return 0;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.