HiveBrain v1.2.0
Get Started
← Back to all entries
snippetcMinor

Optimizations for bubble sort

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
sortbubbleforoptimizations

Problem

The code performs bubble sort on the basis if any swaps has been performed in the iteration. I made it sort of independent of number of iterations as in any conventional bubble sorting code.

I went on pretty much with what I understood from the cs50 class. This mechanism looks more intuitive to me. What improvements I need to do on the design/style/method?

#include

void printMyArray(int a[],int n);

//BUBBLE SORT
int main(){
    int a[] = {-1 , 2 , 0 , -3 , 5 , 1};
    int n = 6;
    for(;;){

       int swap = 0;
       int i = 0;

       for(; i < n-1; i++)
          if( a[i+1] <= a[i]){
              int temp = a[i+1];
              a[i+1] = a[i];
              a[i] = temp;
              swap = 1;
           }
       if(swap == 0)
           break;
    }
    printMyArray(a,6);

}
void printMyArray(int a[],int n){
   int i;
   for(i = 0; i < n ; i++)
     printf("%d\t",a[i]);
   printf("\n");
}

Solution

Function

-
Certainly no reason to swap when values are equal. In worse case of array {3,3,3,3}, leads to infinite loop.

//if( a[i+1] <= a[i]){
if(a[i+1] < a[i]) {


-
Use size_t to index arrays.

// void printMyArray(int a[],int n){
void printMyArray(int a[], size_t n) {


Style

-
Rather than int for Boolean variables use bool.

#include 

// int swap = 0;
bool swap = false;


-
Recommend const when able. Adds clarity to the function and allows for optimizations with some compilers.

// void printMyArray(int a[],int n){
void printMyArray(const int a[], int n) {


-
Minor: prefer int *a rather than int a[] as argument in printMyArray().

-
More useful to separate main() from the code under test. Something like:

int main(void) {
    int a[] = {-1 , 2 , 0 , -3 , 5 , 1};
    bubble_sort(a, sizeof a/ sizeof a[0]);
    printMyArray(a, sizeof a/ sizeof a[0]);
    return 0;     
}


-
Suggest fully {} blocks. Use Idiomatic for(), Avoid n-1, as size_t n may be 0.

// int i = 0;
   // for(; i < n-1; i++)

   for(size_t i = 1; i < n; i++) {
     if(a[i] < a[i-1]) {
       int temp = a[i];
       a[i] = a[i-1];
       a[i-1] = temp;
       swap = 1;
     }
   }

Code Snippets

//if( a[i+1] <= a[i]){
if(a[i+1] < a[i]) {
// void printMyArray(int a[],int n){
void printMyArray(int a[], size_t n) {
#include <stdbool.h>

// int swap = 0;
bool swap = false;
// void printMyArray(int a[],int n){
void printMyArray(const int a[], int n) {
int main(void) {
    int a[] = {-1 , 2 , 0 , -3 , 5 , 1};
    bubble_sort(a, sizeof a/ sizeof a[0]);
    printMyArray(a, sizeof a/ sizeof a[0]);
    return 0;     
}

Context

StackExchange Code Review Q#127861, answer score: 6

Revisions (0)

No revisions yet.