comparison 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
comparison
equal deleted inserted replaced
930:35efda39c2d9 932:f4d7cf77ec3d
1 #include "QuickSort.h" 1 #include "QuickSort.h"
2 #include <stdio.h> 2 #include <stdio.h>
3 #include <string.h> 3 #include <string.h>
4 #include "SpeProfile.h"
5 4
6 SchedDefineTask(QuickSort); 5 SchedDefineTask(QuickSort);
7 6
8 static void bubble_sort(DataPtr data, int begin, int end); 7 static void quick_sort( Data *data, int begin, int end ) ;
9 static void quick_sort(DataPtr data, int begin, int end);
10
11 static void swap(Data *data, int left, int right);
12
13 static int
14 run(SchedTask *smanager, void* rbuff, void* wbuff) {
15 int begin = 0;
16 int end = (long)smanager->get_param(0);
17 DataPtr r_data = (DataPtr)smanager->get_input(0);
18 DataPtr w_data = (DataPtr)smanager->get_output(0);
19 //SpeProfile *prof = new SpeProfile;
20
21 //prof->ProfStart();
22 if (0)
23 bubble_sort(r_data, begin, end-1);
24 else
25 quick_sort(r_data, begin, end-1);
26 memcpy(w_data, r_data, sizeof(Data)*end);
27 //prof->ProfStop();
28 //prof->ProfPrint();
29
30 //delete prof;
31 return 0;
32 }
33
34 static void 8 static void
35 bubble_sort(DataPtr data, int begin, int end) 9 swap( Data *data, int left, int right )
36 {
37 for (int i = 0; i < end; i++) {
38 for (int j = end; j > i; j--) {
39 if (data[j].index < data[j-1].index) {
40 swap(data, j, j-1);
41 }
42 }
43 }
44 }
45
46
47 static void
48 quick_sort(DataPtr data, int begin, int end)
49 {
50 if (begin < end) {
51
52 int where = (begin + end) / 2;
53 int pivot = data[where].index;
54 data[where].index = data[begin].index;
55 int p = begin;
56
57 for (int i = begin+1; i <= end; i++) {
58 if (data[i].index < pivot) {
59 p++;
60 swap(data, p, i);
61 }
62 }
63
64 data[begin].index = data[p].index;
65 data[p].index = pivot;
66
67 quick_sort(data, begin, p-1);
68 quick_sort(data, p+1, end);
69 }
70 }
71
72
73 static void
74 swap(Data *data, int left, int right)
75 { 10 {
76 int tmp = data[left].index; 11 int tmp = data[left].index;
77 data[left].index = data[right].index; 12 data[left].index = data[right].index;
78 data[right].index = tmp; 13 data[right].index = tmp;
79 } 14 }
80 15
16 static int
17 run(SchedTask *s, void* rbuff, void* wbuff) {
18 // copy value
19 int begin = 0;
20 #if USE_SIMPLE_TASK
21 long end = s->read_size()/sizeof(Data);
22 Data *r_data = (Data*)rbuff;
23 #else
24 int end = (long)s->get_param(0);
25 DataPtr r_data = (DataPtr)s->get_input(0);
26 #endif
27
28 //printf("[PPE] Quick: length:%d addr->%x \n",end, (int*)rbuff);
29 //printf("[PPE] Quick: data[0]: %d addr->%x\n",sizeof(r_data),r_data);
30
31 //show_data(r_data, end);
32 quick_sort(r_data, begin, end-1);
33 s->swap();
34 // memcpy(w_data, r_data, sizeof(Data)*end);
35
36 return 0;
37 }
38
39 static void
40 quick_sort( Data *data, int begin, int end ) {
41
42 if (begin < end) {
43 int where = (begin + end) / 2;
44 int pivot = data[where].index;
45 data[where].index = data[begin].index;
46 int p = begin;
47 int i;
48 for (i=begin+1; i<=end; i++) {
49 if (data[i].index < pivot) {
50 p++;
51 swap(data, p, i);
52 }
53 }
54 data[begin].index = data[p].index;
55 data[p].index = pivot;
56
57 quick_sort(data, begin, p-1);
58 quick_sort(data, p+1, end); // tail call
59 }
60 }
61
62
81 /* end */ 63 /* end */