-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathessSort.c
117 lines (85 loc) · 2.52 KB
/
essSort.c
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "ess.h"
/**
* Sort the set of Individual with respect to their cost (`c`) or dist (`d`).
*/
void quickSort_Set(eSSType *eSSParams, Set *set, int left, int right, char key){
double *values;
values = (double *)malloc(set->size * sizeof(double));
// allocate_ind_memory(eSSParams, &(pivot_ind), eSSParams->nreal);
// TODO: It could be as a static variable
for (int i = 0; i < set->size; ++i)
{
if (key == 'c')
values[i] = set->members[i].cost;
else if (key == 'd')
values[i] = set->members[i].dist;
}
// printf("hi\n");
quickSort(eSSParams, set, values, left, right);
// printf("hi\n");
// deallocate_ind_memory(eSSParams, &(pivot_ind));
free(values);
}
Individual pivot_ind; // Might cause problem
/**
* Perform QuickSort in-place, based on the values array which could be cost or dist.
*/
void quickSort(eSSType *eSSParams, Set *set, double* values, int left, int right){
double pivot;
int l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = values[left];
pivot_ind = set->members[left];
while (left < right)
{
while ((values[right] >= pivot) && (left < right))
right--;
if (left != right)
{
values[left] = values[right];
set->members[left] = set->members[right];
// TODO: Check the assigment
left++;
}
while ((values[left] <= pivot) && (left < right))
left++;
if (left != right)
{
values[right] = values[left];
set->members[right] = set->members[left];
// TODO: Check the assignment
right--;
}
}
values[left] = pivot;
set->members[left] = pivot_ind;
pivot = left;
left = l_hold;
right = r_hold;
// free(&pivot_ind);
if (left < pivot)
quickSort(eSSParams, set, values, left, pivot-1);
if (right > pivot)
quickSort(eSSParams, set, values, pivot+1, right);
}
/*
Remove the last item of the set and put the ind at it's correct place, assuming that
the list is already a sorted list.
So, it's basically a reverse Insertion Sort!
*/
// TODO: Need to be modified
void insertionSort(eSSType *eSSParams, Set *set, int location, char key){
Individual temp;
// allocate_ind_memory(eSSParams, &(temp), eSSParams->nreal);
int j = location; // The iteration starts from `set->size - 1` since the last
// item should be replaced anyway.
while (j > 0 && set->members[j].cost < set->members[j - 1].cost) {
temp = set->members[j - 1];
set->members[j - 1] = set->members[j];
set->members[j] = temp;
j--;
}
// free(&temp);
// deallocate_ind_memory(eSSParams, &(temp));
}