C语言 使用冒泡排序算法交换数组和结构向量中的项

lstz6jyr  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(128)

我有一个表示数据库Vector *vec_date_present中项的位置的向量(已排序)以及一个双vec_dates_time数组,我想用冒泡排序算法对vec_dates_time进行排序,同时保留相应的位置项,最终将生成以下输出:

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

但我得到了一个分割错误。
我怎样才能解决这个问题呢?
下面是源代码:

#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;
}
tf7tbtn2

tf7tbtn21#

看来你是说

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

函数交换看起来像

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;
}

你还应该写

vec_date_present->size_array = VECSIZE;

代替

vec_date_present->size_array = 0;

相关问题