コード例 #1
0
ファイル: ft_pred.c プロジェクト: aevernon/triggerman
// Quick sort routine to sort the words according to their selectivities.
static void quick_sort (double *selectivity, var_array *words, int left, int right)
{
	int last, current;

	if (left >= right)
	{
		return;
	}

	// Pick the pivot and isolate it at the leftmost position.
	swap_elements (selectivity, words, left, (left+right)/2);

	// Partitioning of arrays.
	// last keeps track of the last position where an element smaller to the pivot was placed.
	last = left;
	for (current = left + 1; current <= right; current++)
	{
		if (selectivity[current] < selectivity[left])
		{
			swap_elements (selectivity, words, ++last, current);
		}
	}

	// Place the pivot at its place.
    swap_elements (selectivity, words, left, last);

	// Recursively sort left and right partitions.
    quick_sort(selectivity, words, left, last-1);
    quick_sort(selectivity, words, last+1, right);
}
void decrease_key(position pos,element_type delta,PRIORITY_QUEUE H)
{
    if(pos>H->size)
        return;

    position prev;
    *H->elements[pos]+=delta;
    for(prev=get_father(pos); prev>=1&&((*H->elements[prev])>(*H->elements[pos])); pos=prev,prev=get_father(prev)) {
        swap_elements(prev,pos,H);
    }

    if(((*H->elements[prev])=(*H->elements[pos]))&&((*H->elements[prev])>(*H->elements[pos+1]))) {
        swap_elements(prev,pos+1,H);
    }
}
void increase_key(position pos,element_type delta,PRIORITY_QUEUE H)
{
    if(pos>H->size)
        return;

    position child;
    *H->elements[pos]-=delta;
    for(chid=pos*2; child<H->size&&((*H->elements[child])<(*H->elements[pos])); pos=child,child=child*2) {
        swap_elements(pos,child,H);
        if((*H->elements[pos])>(*H->elements[child+1]))
            swap_elements(pos,child+1,H);
    }

    if(((*H->elements[pos])=(*H->elements[child]))&&((*H->elements[pos])>(*H->elements[child+1]))) {
        swap_elements(pos,child+1,H);
    }
}
コード例 #4
0
void ternary_hsort_r(void *base,
                     size_t nmemb,
                     size_t size,
                     compare_fun3 compare,
                     void *arg) {
  if (nmemb <= 1) {
    /* nothing to sort!! */
    return;
  }
  ternary_heapify(base, nmemb, size, compare, arg);
  size_t end = nmemb - 1;
  for (end = nmemb - 1; end > 0; end--) {
    void *end_ptr = POINTER(base, end, size);
    swap_elements(base, end_ptr, size);
    ternary_sift_down(base, 0, size, end-1, compare, arg);
  }
}
コード例 #5
0
void ternary_sift_down(void *base,
                       size_t start,
                       size_t size,
                       size_t max_index,
                       compare_fun3 compare,
                       void *arg) {
  size_t root = start;
  while (TRUE) {
    size_t left_child = LEFT(root);
    if (left_child > max_index) {
      break;
    }
    void *root_ptr = POINTER(base, root, size);
    size_t swap = root;
    void *swap_ptr = root_ptr;
    void *left_child_ptr = POINTER(base, left_child, size);
    if (compare(swap_ptr, left_child_ptr, arg) < 0) {
      swap = left_child;
      swap_ptr = left_child_ptr;
    }
    size_t middle_child = MIDDLE(root);
    size_t right_child = RIGHT(root);
    if (middle_child <= max_index) {
      void *middle_child_ptr = POINTER(base, middle_child, size);
      if (compare(swap_ptr, middle_child_ptr, arg) < 0) {
        swap = middle_child;
        swap_ptr = middle_child_ptr;
      }
      if (right_child <= max_index) {
        void *right_child_ptr = POINTER(base, right_child, size);
        if (compare(swap_ptr, right_child_ptr, arg) < 0) {
          swap = right_child;
          swap_ptr = right_child_ptr;
        }
      }
    }

    if (swap != root) {
      swap_elements(root_ptr, swap_ptr, size);
      root = swap;
      root_ptr = swap_ptr;
    } else {
      return;
    }
  }
}
コード例 #6
0
ファイル: symtable.c プロジェクト: TacOS-team/tacos
static void sort_symbols(symbol_table_t* table) {
	int no_swap = 1;
	int i;
	
	do
	{
		no_swap = 1;
		for(i = 0; i<table->count-1; i++)
		{
			if(table->symbols[i].addr > table->symbols[i+1].addr)
			{
				swap_elements(table, i, i+1);
				no_swap = 0;
			}
		}
	}while(!no_swap);
}
コード例 #7
0
ファイル: fsort.c プロジェクト: bk1/sysprogramming-examples
void fsort_f(void *base,
             size_t nmemb,
             size_t size,
             double factor,
             compare_fun3 compare,
             void *argc,
             metric_fun2 metric,
             void *argm) {
  if (nmemb <= 1) {
    /* nothing to sort */
    return;
  }

  /* preparation: form classes */
  /* use calculate_k for a purpose it has not been made for, but since it is identical with what is needed here it is correct */
  size_t lsize = calculate_k(nmemb, factor, nmemb) + 1;
  if (lsize < 2) {
    lsize = 2;
  }
  size_t *l = (size_t *) malloc(lsize * sizeof(size_t));
  handle_ptr_error(l, "malloc for l", PROCESS_EXIT);
  for (size_t k = 0; k < lsize; k++) {
    l[k] = 0;
  }
  //size_t idx_min = 0;
  void *amin = POINTER(base, 0, size);
  size_t idx_max = 0;
  void *amax = POINTER(base, idx_max, size);
  for (size_t i = 0; i < nmemb; i++) {
    if (compare(POINTER(base, i, size), amin, argc) < 0) {
      // idx_min = i;
      amin = POINTER(base, i, size);
    }
    if (compare(POINTER(base, i, size), amax, argc) > 0) {
      idx_max = i;
      amax = POINTER(base, i, size);
    }
  }
  if (compare(amin, amax, argc) == 0) {
    /* min and max are the same --> already sorted */
    free(l);
    return;
  }
  double amin_metric = metric(amin, argm);
  double amax_metric = metric(amax, argm);
  double step = (lsize - 1)/(amax_metric - amin_metric);
  /* size_t k_min = calculate_k(step, 0, lsize); */
  /* size_t k_max = calculate_k(step, amax_metric - amin_metric, lsize); */

  /* count the elements in each of the lsize classes */
  for (size_t i = 0; i < nmemb; i++) {
    double ai_metric = metric(POINTER(base, i, size), argm);
    size_t k = calculate_k(step, ai_metric - amin_metric, lsize);
    l[k]++;
  }

  /* find the start positions for each of the classes */
  size_t *ll = (size_t *) malloc((lsize + 1) * sizeof(size_t));
  handle_ptr_error(ll, "malloc for ll", PROCESS_EXIT);
  ll[0] = 0;
  ll[1] = l[0];

  for (size_t k = 1; k < lsize; k++) {
    l[k] += l[k-1];
    ll[k+1] = l[k];
  }

  swap_elements(POINTER(base, 0, size), POINTER(base, idx_max, size), size);
  // printf("prepared\n");

  /* do the permutation */
  size_t nmove = 0;
  size_t j = 0;
  size_t k = lsize - 1;
  while (nmove < nmemb - 1) {
    while (j >= l[k]) {
      j++;
      k = calculate_k(step, metric(POINTER(base, j, size), argm) - amin_metric, lsize);
    }
    /* now: j < l[k] */
    void *flash_ptr = alloca(size);
    handle_ptr_error(flash_ptr, "alloca for flash_ptr", PROCESS_EXIT);
    /* flash_ptr takes element a[j] such that j > l[k] */
    memcpy(flash_ptr, POINTER(base, j, size), size);
    while (j != l[k]) {
      k = calculate_k(step, metric(flash_ptr, argm) - amin_metric, lsize);
      void *alkm_ptr = POINTER(base, l[k]-1, size);
      swap_elements(flash_ptr, alkm_ptr, size);
      l[k]--;
      nmove++;
    }
  }

  /* use qsort or hsort for each class */
  for (k = 0; k < lsize; k++) {
    size_t n = ll[k+1] - ll[k];
    if (n > 1 && ll[k+1] < ll[k] || n > nmemb) {
      char txt[4096];
      sprintf(txt, "wrong order: k=%ld lsize=%ld nmemb=%ld n=%ld ll[k]=%ld ll[k+1]=%ld\n", k, lsize, nmemb, n, ll[k], ll[k+1]);
      handle_error_myerrno(-1, EDOM, txt, PROCESS_EXIT);
    }
    if (n > 7) {
      void *basek = POINTER(base, ll[k], size);
      hsort_r(basek, n, size, compare, argc);
    } else  if (n > 1) {
      void *basek = POINTER(base, ll[k], size);
      isort_r(basek, n, size, compare, argc);
    }
  }
  free(l);
  l = NULL;
  free(ll);
  ll = NULL;
  return;
}