void swap(void list1, void list2, void list3, int i, int j) {
int t;
char t_str2, t_str3;
t = get(list1,i); t_str2 = get(list2,i); t_str3 = get(list3,i);
set(list1,i,get(list1,j)); set(list2,i,get(list2,j)); set(list3,i,get(list3,j));
set(list1,j,t); set(list2,j,t_str2); set(list3,j,t_str3);
}
int partition(void list1, void list2, void list3, int l, int r, int order_flag) {
int x = get(list1,r);
int i = (l - 1), j;
for (j = l; j <= r-1; j++) {
if ( !order_flag ) {
if (get(list1,j) <= x) {
i++;
swap(list1,list2,list3,i,j);
}
} else {
if (get(list1,j) > x) {
i++;
swap(list1,list2,list3,i,j);
}
}
}
swap(list1,list2,list3,i+1,r);
return (i+1);
}
void quickSortIterative(void list1, void list2, void list3, int l, int r, int order_flag) {
// Create an auxiliary stack
int stack = array(r-l+1);
// initialize top of stack
int top = -1;
// push initial values of l and h to stack
set(stack, ++top, l);
set(stack, ++top, r);
if ( order_flag == NULL() ) order_flag = 0;
// Keep popping from stack while is not empty
while ( top >= 0 ) {
// Pop h and l
r = get(stack, top--);
l = get(stack, top--);
// Set pivot element at its correct position in sorted array
int p = partition(list1, list2, list3, l, r, order_flag);
// If there are elements on left side of pivot, then push left
// side to stack
if ( p-1 > l ) {
set(stack, ++top, l);
set(stack, ++top, p-1);
}
// If there are elements on right side of pivot, then push right
// side to stack
if ( p+1 < r ) {
set(stack, ++top, p+1);
set(stack, ++top, r);
}
}
free(stack);
}