csortingstructswapbubble-sort

Swap items both in an array an a struct Vector using bubble sort algorithm


I have a vector representing position of items in a database Vector *vec_date_present (which is ordered) as well as an array of double vec_dates_time and I want to sort vec_dates_time with the bubble sort algorithm while preserving the corresponding position item which, eventually would produce the following output:

Sorted:
4: 0.1
1: 0.2
0: 2.3
3: 1.2
2: 5.8
5: 9.2

But I get a segmentation fault.

How could I solve the problem?

Here is the source code:

#include <stdio.h>
#include <stdlib.h>

#define VECSIZE 6

typedef struct {
  size_t size_array;
  size_t *array;
} Vector ;

void swap_vector(double* date1, double* date2, size_t** idx1, size_t** idx2)
{

    double dtemp = *date1;
    *date1 = *date2;
    *date2 = dtemp;

    size_t *utemp = *idx1;
    **idx1 = **idx2;
    **idx2 = *utemp;
}

void bubble_sort_date(Vector *vec_date_present, double *vec_dates_time)
{

  int i, j;
  for (i = 0; i < vec_date_present->size_array - 1; i++)
    // Last i elements are already in place
    for (j = 0; j < vec_date_present->size_array - i - 1; j++)
      if (vec_dates_time[j] > vec_dates_time[j+1])
        swap_vector(&vec_dates_time[j], &vec_dates_time[j+1], &vec_date_present[j].array, &vec_date_present[j+1].array);
}


int main()
{
  Vector *vec_date_present = (Vector *) malloc(sizeof(Vector));
  vec_date_present->array = (size_t *) malloc(VECSIZE * sizeof(size_t));
  vec_date_present->size_array = 0;
  double *vec_dates_time = (double *) malloc(VECSIZE*sizeof(double));
  size_t i;
  for (i= 0; i<VECSIZE; i++)
  {
    vec_date_present->array[i] = i;
  }
  vec_dates_time[0] = 2.3;
  vec_dates_time[1] = 0.2;
  vec_dates_time[2] = 5.8;
  vec_dates_time[3] = 1.2;
  vec_dates_time[4] = 0.1;
  vec_dates_time[5] = 9.2;
  printf("Non sorted:\n");
  for (i= 0; i<VECSIZE; i++)
  {
    printf("%zu: %.1f\n", vec_date_present->array[i], vec_dates_time[i]);
  }
  bubble_sort_date(vec_date_present, vec_dates_time);
  printf("Sorted:\n");
  for (i= 0; i<VECSIZE; i++)
  {
    printf("%zu: %1.f\n", vec_date_present->array[i], vec_dates_time[i]);
  }
  free(vec_date_present->array);
  free(vec_date_present);
  free(vec_dates_time);
  return 0;
}

Solution

  • It seems you mean

    swap_vector(&vec_dates_time[j], &vec_dates_time[j+1], &vec_date_present->array[j], &vec_date_present->array[j+1]);
    

    And the function swap will look like

    void swap_vector(double* date1, double* date2, size_t* idx1, size_t* idx2)
    {
        double dtemp = *date1;
        *date1 = *date2;
        *date2 = dtemp;
    
        size_t utemp = *idx1;
        *idx1 = *idx2;
        *idx2 = utemp;
    }
    

    Also you should write

    vec_date_present->size_array = VECSIZE;
    

    instead of

    vec_date_present->size_array = 0;