I have read sources that say that the time complexities for Selection sort are:
- Best-case: O(n^2)
- Average-case: O(n^2)
- Worst-case: O(n^2)
I was wondering if it is worth it to "optimize" the algorithm by adding a certain line of code to make the algorithm "short-circuit" itself if the remaining part is already sorted.
Here's the code written in C:
I have also added a comment which indicates which lines are part of the "optimization" part.
void printList(int* num, int numElements) {
    int i;  
    for (i = 0; i < numElements; i ++) {
        printf("%d ", *(num + i));
    }
    printf("\n");
}
int main() {
    int numElements = 0, i = 0, j = 0, min = 0, swap = 0, numSorted = 0;
    printf("Enter number of elements: ");
    scanf("%d", &numElements);
    int* num = malloc(sizeof(int) * numElements);
    for (i = 0; i < numElements; i ++) {
        printf("Enter number = ");
        scanf(" %d", num + i);
    }
    for (i = 0; i < numElements-1; i++) {
        numSorted = i + 1;  // "optimized"
        min = i;
        for (j = i + 1; j < numElements; j++) {
            numSorted += *(num + j - 1) <= *(num + j);  // "optimized"
            if (*(num + min) > *(num + j))
                min = j;
        }
        if (numSorted == numElements)  // "optimized"
           break;
        if (min != i) {
            swap = *(num + i);
            *(num + i) = *(num + min);
            *(num + min) = swap;
        }
        printList(num, numElements);
    }
    printf("Sorted list:\n");
    printList(num, numElements);
    free(num);
    getch();
    return 0;
}
 
     
     
     
     
     
     
    