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<stdio.h>
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");
}
-
2\$\begingroup\$ One obvious optimization: Don't use bubblesort! \$\endgroup\$Edward– Edward2016年05月08日 22:05:35 +00:00Commented May 8, 2016 at 22:05
-
\$\begingroup\$ I get the point but I am asking in terms of improving the above scenario. \$\endgroup\$piepi– piepi2016年05月08日 22:11:38 +00:00Commented May 8, 2016 at 22:11
1 Answer 1
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 usebool
.#include <stdbool.h> // 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 thanint a[]
as argument inprintMyArray()
.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 Idiomaticfor()
, Avoidn-1
, assize_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; } }