aboutsummaryrefslogtreecommitdiff
path: root/bsort.c
blob: 56f896998ec6044aab9c990d3a3a97c5774398c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>

void print_array(int array[], int len);
void buble_sort(int array[], int len);
void buble_sort_rec(int array[], int len);
void swap(int *to, int *from);

int 
main(void)
{
  int array[] = {4, 2, 1, 7, 8, 9, 6, 0, 3, 5};

  print_array(array, sizeof(array)/sizeof(int));
  buble_sort(array, sizeof(array)/sizeof(int));
  print_array(array, sizeof(array)/sizeof(int));

  return 0;
}

void
print_array(int array[], int len)
{
  while (len--)
    printf("%d, ", *array++);

  printf("\n");
}

void
buble_sort(int array[], int len)
{
  int active, len_cp = len;

  while (--len_cp) {
    if (len_cp == len - 1) {
      active = 0;
    }

    if (array[len_cp] < array[len_cp - 1]) {
      swap(&array[len_cp], &array[len_cp - 1]);
      active = 1;
    }

    if (len_cp == 1 && active)
      len_cp = len;
  }
}



void
buble_sort_rec(int array[], int len)
{
  int active = 0, len_cp = len;

  while (--len_cp > 0)
    if (array[len_cp] < array[len_cp - 1]) {
      swap(&array[len_cp], &array[len_cp - 1]);
      active = 1;
    }

  if (active)
    buble_sort(array, len);
  else
    return;
}

void
swap(int *to, int *from)
{
  int buff = *to;

  *to = *from;
  *from = buff;
}