test.c |
| #include <stdio.h> #include <stdlib.h> #include <time.h> int rand(); int quick_sort(int *a, int n); void merge_sort(int *newa, int *a, int n); void pquicksort(int *a, int hi); void quick(int *a, int n); int main(){ clock_t t1, t2; int length=20; int *a; int *b; int i; /* printf("Size?\n>"); */ /* scanf("%d", &length); */ a = malloc(length * sizeof a[0]); b = malloc(length * sizeof a[0]); for(i=0; i<length; i++){ a[i]=rand(); } t1 = clock(); quick(a,length); t2 = clock(); printf("\nQuick Time: %ld mseconds\t\tLength: %d\n", (long)(t2-t1)/1000,length); for(i=0; i<length; i++){ printf("a[%d]:\t%d\n",i,a[i]); } printf("\n"); for(i=0; i<length; i++){ a[i]=rand(); } t1 = clock(); pquicksort(a,length-1); t2 = clock(); printf("\nMy Quick Time: %ld mseconds\t\tLength: %d\n", (long)(t2-t1)/1000,length); for(i=0; i<length; i++){ printf("a[%d]:\t%d\n",i,a[i]); } printf("\n"); for(i=0; i<length; i++){ a[i]=rand(); } t1 = clock(); merge_sort(b,a,length-1); t2 = clock(); printf("\nMerge Time: %ld mseconds\t\tLength: %d\n", (long)(t2-t1)/1000,length); return 0; } int rand(){ static int rand_seed=10; rand_seed = rand_seed *1103515245+12345; return (unsigned int)(rand_seed / 65536) % 1000; } void quick(int *a, int n){ int i = -1; int j = n; int x = a[0]; int temp; if(n<2){ return; } while(1){ do i++; while(a[i]<x); do j--; while(a[j]>x); if(i<j){ temp = a[i]; a[i] = a[j]; a[j] = temp; } else break; } quick_sort(a, j+1); quick_sort(a+j+1, n-j-1); } int quick_sort(int *a, int n){ if(n>1){ int i = 0; int j = n; int x = a[n/2]; int temp; while(1){ while(a[i]<x) i++; while(a[j]>x) j--; if(i>j) break; temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } quick_sort(a, j); quick_sort(a+i, n-i); } } /* Quick sort with pointers */ void pquicksort(int *a, int hi){ if( hi > 0) { int left, right, median, temp; left=0; right=hi; median=*(a+(hi/2)); while(right >= left){ while(*(a+left) < median) left++; while(*(a+right) > median) right--; if(left > right) break; temp=*(a+left); *(a+left)=*(a+right); *(a+right)=temp; //swap left++; right--; } pquicksort(a, right);// divide and conquer pquicksort(a+left, hi-left); } }/*quicksort*/ void merge_sort(int *newa, int *a, int n){ int insert=23; /* merge(a, p, q, r); */ if(n<=insert){ /* Insertion sort procedure */ int guide=0; int i; int value; int j; for (i=0; i<=n; i++){ value = a[i]; if(a[i]<guide){ for(j=i-1; j >=0 && a[j] > value; j--){ a[j+1]=a[j]; } a[j+1]=value; } if (value>guide) guide=value; /* End Insertion Sort procedure */ } }else{ /* divide */ int q=n/2; int i; int s = 0; int j = q+1; merge_sort(newa,a,q); merge_sort(newa,a+q+1,n-q-1); /* and conquer */ for(i=0;s<q+1;i++){ if( j>n || a[s] <= a[j]) { newa[i]=a[s++]; }else if(a[s] >a[j]) { newa[i]=a[j++]; } } while(j<=n){ newa[i++]=a[j++]; } for(i=0,s=0;i<=n;i++,s++){ a[s]=newa[i]; } /* End of Merge sort Procedure */ } } |
James Little |