foobar-scripts / merge-sort-struct.c

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91``` ```/* Simple Merge Sort implementation- sorts a collection of nodes, using only one of the data members for the sorting operation */ /* Amit Saha. */ # include struct obj_values{ int value; int ori_pos }; int main(int argc, char **argv) { struct obj_values *nodes = (struct obj_values *)malloc(10*sizeof(struct obj_values)); int i; for(i=0;i<=9;i++) { (nodes + i)->value= -2*i*i; (nodes + i)->ori_pos=i; } merge_sort(nodes,0,9); for(i=0;i<=9;i++) { printf("%d %d \n", (nodes + i)->ori_pos,(nodes + i)->value); } } void merge_sort(struct obj_values *indices, int x, int z ) { int y; if(xvalue < (indices + mark2)->value) { (temp + cnt)->value = (indices + mark1)->value; (temp + cnt)->ori_pos = (indices + mark1)->ori_pos; cnt++; mark1++; } else { (temp+cnt)->value = (indices+mark2)->value; (temp+cnt)->ori_pos = (indices+mark2)->ori_pos; cnt++; mark2++; } } while(mark1 <= y) { (temp + cnt)->value = (indices + mark1)->value; (temp + cnt)->ori_pos = (indices + mark1)->ori_pos; cnt++; mark1++; } while(mark2 <= z) { (temp+cnt)->value = (indices+mark2)->value; (temp+cnt)->ori_pos = (indices+mark2)->ori_pos; cnt++; mark2++; } memcpy(indices + x,temp,(z - x + 1)*sizeof(struct obj_values)); free(temp); } ```