6 int smaller_arr(int *dst, int *src, int pivot,int len)
20 int bigger_arr(int *dst, int *src, int pivot,int len)
34 int median_const(int len, int * array)
37 int desired_rank = ceil(len/2);
44 /* FIXME: exception handling */
45 if(i!=j && array[j]>array[i])
49 if(rank==desired_rank)
55 int select_med(int size, int * array)
58 int * array_of_median;
59 int len = ceil(size/5);
62 /* divide array into groups of five elements */
63 array_of_median = malloc(sizeof(int)*len);
68 array_of_median[i] = median_const(5,array+5*i);
70 array_of_median[i] = median_const(len%5,array+5*i);
73 /* call itself recursively */
74 ret = select_med(len, array_of_median);
77 free(array_of_median);
84 void quicksort_init(DOLProcess *p) {
88 int quicksort_fire(DOLProcess *p) {
95 /* receive the 'size' / 'array' */
96 DOL_read((void*)PORT_IN1, &len, sizeof(int), p);
97 DOL_read((void*)PORT_IN2, array, sizeof(int)*len, p);
100 median = select_med(len, array);
104 down=smaller_arr(arr1,array,median,len);
105 up=bigger_arr(arr2,array,median,len);
114 /* send the 'size' / 'sorted array' */
115 DOL_write((void*)PORT_OUT1, &len, sizeof(int), p);