#include <stdio.h> #include <conio.h> #define MAXELT 100 #define INFINITY 32760 // numbers in list should not exceed // this. change the value to suit your // needs #define SMALLSIZE 10 // not less than 3 #define STACKSIZE 100 // should be ceiling(lg(MAXSIZE)+1) int list[MAXELT+1]; // one extra, to hold INFINITY struct { // stack element. int a,b; } stack[STACKSIZE]; int top=-1; // initialise stack int main() // overhead! { int i=-1,j,n; char t[10]; void quicksort(int); do { if (i!=-1) list[i++]=n; else i++; printf("Enter the numbers <End by #>: "); fflush(stdin); scanf("%[^\n]",t); if (sscanf(t,"%d",&n)<1) break; } while (1); quicksort(i-1); printf("\nThe list obtained is "); for (j=0;j<i;j++) printf("\n %d",list[j]); printf("\n\nProgram over."); getch(); return 0; // successful termination. } void interchange(int *x,int *y) // swap { int temp; temp=*x; *x=*y; *y=temp; } void split(int first,int last,int *splitpoint) { int x,i,j,s,g; // here, atleast three elements are needed if (list[first]<list[(first+last)/2]) { // find median s=first; g=(first+last)/2; } else { g=first; s=(first+last)/2; } if (list[last]<=list[s]) x=s; else if (list[last]<=list[g]) x=last; else x=g; interchange(&list[x],&list[first]); // swap the split-point element // with the first x=list[first]; i=first+1; // initialise j=last+1; while (i<j) { do { // find j j--; } while (list[j]>x); do { i++; // find i } while (list[i]<x); interchange(&list[i],&list[j]); // swap } interchange(&list[i],&list[j]); // undo the extra swap interchange(&list[first],&list[j]); // bring the split-point // element to the first *splitpoint=j; } void push(int a,int b) // push { top++; stack[top].a=a; stack[top].b=b; } void pop(int *a,int *b) // pop { *a=stack[top].a; *b=stack[top].b; top--; } void insertion_sort(int first,int last) { int i,j,c; for (i=first;i<=last;i++) { j=list[i]; c=i; while ((list[c-1]>j)&&(c>first)) { list[c]=list[c-1]; c--; } list[c]=j; } } void quicksort(int n) { int first,last,splitpoint; push(0,n); while (top!=-1) { pop(&first,&last); for (;;) { if (last-first>SMALLSIZE) { // find the larger sub-list split(first,last,&splitpoint); // push the smaller list if (last-splitpoint<splitpoint-first) { push(first,splitpoint-1); first=splitpoint+1; } else { push(splitpoint+1,last); last=splitpoint-1; } } else { // sort the smaller sub-lists // through insertion sort insertion_sort(first,last); break; } } } // iterate for larger list }
Non-recursive Quicksort Algorithm
BlitzMax Forums/BlitzMax Programming/Non-recursive Quicksort AlgorithmThe forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.