view example/many_task/spe/QuickSort.cc @ 932:f4d7cf77ec3d

sort test (add swap())
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 00:57:46 +0900
parents ab866bc8a624
children da657af64afd
line wrap: on
line source

#include "QuickSort.h"
#include <stdio.h>
#include <string.h>

SchedDefineTask(QuickSort);

static void quick_sort( Data *data, int begin, int end ) ;
static void
swap( Data *data, int left, int right )
{
    int tmp	      = data[left].index;
    data[left].index  = data[right].index;
    data[right].index = tmp;
}

static int
run(SchedTask *s, void* rbuff, void* wbuff) {
    // copy value
    int begin	= 0;
#if USE_SIMPLE_TASK
    long end = s->read_size()/sizeof(Data);
    Data *r_data = (Data*)rbuff;
#else
    int end   = (long)s->get_param(0);
    DataPtr r_data = (DataPtr)s->get_input(0);
#endif

    //printf("[PPE] Quick: length:%d addr->%x \n",end, (int*)rbuff);
    //printf("[PPE] Quick: data[0]: %d addr->%x\n",sizeof(r_data),r_data); 

    //show_data(r_data, end);
    quick_sort(r_data, begin, end-1);
    s->swap();
    // memcpy(w_data, r_data, sizeof(Data)*end);

    return 0;
}

static void 
quick_sort( Data *data, int begin, int end ) {

    if (begin < end) {
	int where = (begin + end) / 2;
	int pivot = data[where].index;
	data[where].index = data[begin].index;
	int p = begin;
	int i;
	for (i=begin+1; i<=end; i++) {
	    if (data[i].index < pivot) { 
		p++; 
		swap(data, p, i); 
	    }
	}
	data[begin].index = data[p].index;
	data[p].index = pivot;
	
	quick_sort(data, begin, p-1);
	quick_sort(data, p+1, end); // tail call
    }
}


/* end */