PartMC  2.8.0
sort.c
Go to the documentation of this file.
1 /* Copyright (C) 2011 Matthew West
2  * Licensed under the GNU General Public License version 2 or (at your
3  * option) any later version. See the file COPYING for details.
4  */
5 
6 /** \file
7  * \brief Wrapper routines for C qsort.
8  */
9 
10 #include <stdlib.h>
11 
12 /** \brief Helper function for integer_sort_c()
13  */
14 int pair_compare(const void *a, const void *b)
15 {
16  int a_val = *((int*)a);
17  int b_val = *((int*)b);
18 
19  if (a_val < b_val) {
20  return -1;
21  } else if (a_val > b_val) {
22  return 1;
23  } else {
24  return 0;
25  }
26 }
27 
28 /** \brief Helper function for double_sort_c()
29 */
30 int pair_compare_d(const void *a, const void *b)
31 {
32  double a_val = *((double*)a);
33  double b_val = *((double*)b);
34 
35  if (a_val < b_val) {
36  return -1;
37  } else if (a_val > b_val) {
38  return 1;
39  } else {
40  return 0;
41  }
42 }
43 
44 /** \brief Sort the given data array and return the permutation.
45  *
46  * On return the \c data array is sorted and the \c perm array
47  * contains the permutation, so that <tt>new_data[i] =
48  * data[perm[i]]</tt>, where \c data is the original data and \c
49  * new_data is the sorted data.
50  *
51  * \param n The length of \c data and \c perm.
52  * \param data The data array (sorted on return).
53  * \param perm The permutation on return: <tt>new_data[i] =
54  * data[perm[i]]</tt>.
55  */
56 int integer_sort_c(int n, int *data, int *perm)
57 {
58  int *data_perm;
59  int i;
60 
61  data_perm = (int*)malloc(sizeof(int) * 2 * n);
62  for (i = 0; i < n; i++) {
63  data_perm[2 * i] = data[i];
64  data_perm[2 * i + 1] = i + 1;
65  }
66  qsort(data_perm, n, 2 * sizeof(int), pair_compare);
67  for (i = 0; i < n; i++) {
68  data[i] = data_perm[2 * i];
69  perm[i] = data_perm[2 * i + 1];
70  }
71  free(data_perm);
72 }
73 
74 int double_sort_c(int n, double *data, int *perm)
75 {
76  double *data_perm;
77  int i;
78 
79  data_perm = (double*)malloc(sizeof(double) * 2 * n);
80  for (i = 0; i < n; i++) {
81  data_perm[2 * i] = data[i];
82  data_perm[2 * i + 1] = i + 1;
83  }
84  qsort(data_perm, n, 2 * sizeof(double), pair_compare_d);
85  for (i = 0; i < n; i++) {
86  data[i] = data_perm[2 * i];
87  perm[i] = (int) data_perm[2 * i + 1];
88  }
89  free(data_perm);
90 }
pair_compare_d
int pair_compare_d(const void *a, const void *b)
Helper function for double_sort_c()
Definition: sort.c:30
integer_sort_c
int integer_sort_c(int n, int *data, int *perm)
Sort the given data array and return the permutation.
Definition: sort.c:56
pair_compare
int pair_compare(const void *a, const void *b)
Helper function for integer_sort_c()
Definition: sort.c:14
double_sort_c
int double_sort_c(int n, double *data, int *perm)
Definition: sort.c:74