Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <unistd.h>
- int *input, *output, *flags, size, i;
- int findMinIndex() {
- int minIndex;
- // find next index excluding those used before
- for (i = 0; i < size; i++) {
- if (flags[i] != 1) {
- minIndex = i;
- break;
- }
- }
- // find next index with minimal value
- for (i = 1; i < size; i++) {
- if (flags[i] != 1) {
- if (input[i] < input[minIndex]) {
- minIndex = i;
- }
- }
- }
- return minIndex;
- }
- void sortByMin(int start, int stop) {
- int minIndex;
- while (start <= stop) {
- minIndex = findMinIndex();
- output[start] = input[minIndex];
- flags[minIndex] = 1;
- start++;
- // display flags for debugging:
- // printf("\n# FLAGS:\t");
- // for (i = 0; i < size; i++)
- // printf("%d, ", flags[i]);
- }
- }
- int findMaxIndex() {
- int maxIndex;
- for (i = 0; i < size; i++) {
- if (flags[i] != 1) {
- maxIndex = i;
- break;
- }
- }
- for (i = 1; i < size; i++) {
- if (flags[i] != 1) {
- if (input[i] > input[maxIndex]) {
- maxIndex = i;
- }
- }
- }
- return maxIndex;
- }
- void sortByMax(int start, int stop) {
- int maxIndex;
- while (stop >= start) {
- maxIndex = findMaxIndex();
- output[stop] = input[maxIndex];
- flags[maxIndex] = 1;
- stop--;
- // display flags for debugging:
- // printf("\n# FLAGS:\t");
- // for (i = 0; i < size; i++)
- // printf("%d, ", flags[i]);
- }
- }
- void *p() {
- sortByMin(0, size/2);
- }
- void *q() {
- sortByMax(size/2+1, size-1);
- }
- int main(int argc, char **argv) {
- // default values if no args
- if (argc <= 2) {
- if (argc == 2) size = atoi(argv[1]);
- else size = 25;
- input = (int *)malloc(size * sizeof(int));
- time_t tt;
- int timestrap = time(&tt);
- srand(timestrap);
- for (i = 0; i < size; i++) {
- input[i] = rand()%1000;
- }
- }
- // copy args to array
- else {
- size = argc - 1;
- input = (int *)malloc(size * sizeof(int));
- for (i = 0; i < size; i++) {
- input[i] = atoi(argv[i+1]);
- }
- }
- // set flags
- flags = (int *)malloc(size * sizeof(int));
- for (i = 0; i < size; i++) {
- flags[i] = 0;
- }
- // create output array
- output = (int *)malloc(size * sizeof(int));
- // sorting threads
- pthread_t t1, t2;
- pthread_create(&t1, 0, p, NULL);
- pthread_create(&t2, 0, q, NULL);
- pthread_join(t1, NULL);
- pthread_join(t2, NULL);
- display results
- printf("\nDisplay arrays? (y/n): ");
- char display;
- display = getchar();
- if (display == 'y') {
- // display array before sorting
- char *sep = "";
- printf("# INPUT:\t");
- for (i = 0; i < size; i++) {
- printf("%s%d", sep, input[i]);
- sep = ", ";
- }
- sep = "";
- printf("\n# OUTPUT:\t");
- for (i = 0; i < size; i++) {
- printf("%s%d", sep, output[i]);
- sep = ", ";
- }
- }
- printf("\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment