Example #1
0
/** Quicksort
 *
 * Apply generic quicksort algorithm on supplied data,
 * using pre-allocated buffers.
 *
 * @param data      Pointer to data to be sorted.
 * @param cnt       Number of elements to be sorted.
 * @param elem_size Size of one element.
 * @param cmp       Comparator function.
 * @param arg       3rd argument passed to cmp.
 * @param slot      Pointer to scratch memory buffer
 *                  elem_size bytes long.
 * @param pivot     Pointer to scratch memory buffer
 *                  elem_size bytes long.
 *
 */
static void _qsort(void *data, size_t cnt, size_t elem_size, sort_cmp_t cmp,
    void *arg, void *slot, void *pivot)
{
	if (cnt > 4) {
		size_t i = 0;
		size_t j = cnt - 1;
		
		memcpy(pivot, data, elem_size);
		
		while (true) {
			while ((cmp(INDEX(data, i, elem_size), pivot, arg) < 0) && (i < cnt))
				i++;
			
			while ((cmp(INDEX(data, j, elem_size), pivot, arg) >= 0) && (j > 0))
				j--;
			
			if (i < j) {
				memcpy(slot, INDEX(data, i, elem_size), elem_size);
				memcpy(INDEX(data, i, elem_size), INDEX(data, j, elem_size),
				    elem_size);
				memcpy(INDEX(data, j, elem_size), slot, elem_size);
			} else
				break;
		}
		
		_qsort(data, j + 1, elem_size, cmp, arg, slot, pivot);
		_qsort(INDEX(data, j + 1, elem_size), cnt - j - 1, elem_size,
		    cmp, arg, slot, pivot);
	} else
		_gsort(data, cnt, elem_size, cmp, arg, slot);
}
Example #2
0
//QSORT ala Sedgewick
bool _qsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger l, SQInteger r,SQInteger func)
{
	SQInteger i, j;
	SQArray *a=_array(arr);
	SQObjectPtr pivot,t;
	if( l < r ){
		pivot = a->_values[l];
		i = l; j = r+1;
		while(1){
			SQInteger ret;
			do { 
				++i; 
				if(i > r) break;
				if(!_qsort_compare(v,arr,a->_values[i],pivot,func,ret))
					return false;
			} while( ret <= 0);
			do {
				--j;
				if ( j < 0 ) {
					v->Raise_Error( _SC("Invalid qsort, probably compare function defect") ); 
					return false; 
				}
				if(!_qsort_compare(v,arr,a->_values[j],pivot,func,ret))
					return false;
			}
			while( ret > 0 );
			if( i >= j ) break;
			t = a->_values[i]; a->_values[i] = a->_values[j]; a->_values[j] = t;
		}
		t = a->_values[l]; a->_values[l] = a->_values[j]; a->_values[j] = t;
		if(!_qsort( v, arr, l, j-1,func)) return false;
		if(!_qsort( v, arr, j+1, r,func)) return false;
	}
	return true;
}
/* sort input lines */
int main(int argc, char *argv[])
{
    int nlines; /* number of input lines read */
    int numeric = 0; /* 1 if numeric sort */
    int reverse = 0; /* 1 if reverset sort */

    getop(argc, argv, &numeric, &reverse);

    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
	if (numeric){
	    if (reverse) {
		_qsort((void**) lineptr, 0, nlines - 1, (int (*) (void *, void *)) rnumcmp);
	    } else {
		_qsort((void**) lineptr, 0, nlines - 1, (int (*) (void *, void *)) numcmp);
	    }
	} else {
	    if (reverse) {
		_qsort((void**) lineptr, 0, nlines - 1, (int (*) (void *, void *)) rstrcmp);
	    } else {
		_qsort((void**) lineptr, 0, nlines - 1, (int (*) (void *, void *)) strcmp);
	    }
	}

	writelines (lineptr, nlines);
	return 0;
    } else {
	printf ("input too big to sort\n");
	return 1;
    }
}
Example #4
0
void _qsort(int *a, int left, int right) {
    if (left<right) {
        int pivotIndex = _partition(a, left, right);
        _qsort(a, left, pivotIndex-1);
        _qsort(a, pivotIndex+1 ,right);
    }
}
Example #5
0
static void _qsort(void *base,size_t size,fCompare cmp,int left,int right) {
	/* TODO someday we should provide a better implementation which uses another sort-algo
	 * for small arrays, don't uses recursion and so on */
	if(left < right) {
		int i = divide(base,size,cmp,left,right);
		_qsort(base,size,cmp,left,i - 1);
		_qsort(base,size,cmp,i + 1,right);
	}
}
int _qsort(int li, int ls) {

     int p;

     if(li < ls) {

           p = pivot(li, ls);

           _qsort(li, p - 1);

           _qsort(p + 1, ls);
     }
};
Example #7
0
int main(int argc, char *argv[])
{
  char *lineptr[LINES]; /* pointers to text lines */
  int nlines;           /* number of input lines read */
  int c, rc = 0;

  while (--argc > 0 && (*++argv)[0] == '-') {
    while ((c = *++argv[0])) {
      switch(c) {
      case 'f': /* fold upper and lower cases */
          option |= FOLD;
          break;
      case 'n': /* numeric sort */
          option |= NUMERIC;
          break;
      case 'r': /* sort in decreasing order */
          option |= DECR;
          break;
      default:
          printf("sort: illegal option %c\n", c);
          argc = 1;
          rc = -1;
          break;
      }
    }
  }


  if (argc) {
    printf("Usage: sort -fnr \n");
  } else {

    if ((nlines = readlines(lineptr, LINES)) > 0) {
      if (option & NUMERIC) {
        _qsort((void **) lineptr, 0, nlines - 1, (int (*)(void *, void *)) numcmp);
      } else if (option & FOLD) {
        _qsort((void **) lineptr, 0, nlines - 1, (int (*)(void *, void *)) charcmp);
      } else {
        _qsort((void **) lineptr, 0, nlines - 1, (int (*)(void *, void *)) strcmp);
      }

      writelines(lineptr, nlines, option & DECR);
    } else {
      printf("input too big to sort \n");
      rc = -1;
    }
  }

  return rc;
}
Example #8
0
void _qsort(int* nums, int left, int right){
    // printf("srotArr3..\n");
    if(left >= right){
        return;  //递归终止条件
    }

    srand((int)time(0));
    int randLocIndex = rand() % (right - left) + left;  //获得一个随机位置
    int tmp;

    //交换随机位置和最左边位置的值
    tmp = nums[left];
    nums[left] = nums[randLocIndex];
    nums[randLocIndex] = tmp;

    int i,j,key;
    key = nums[left];  //分治的比较值
    i = left;
    j = right;

    while(i<j){

        while(i<j && nums[j]>=key){  //右边找到一个小于key的索引位置
            j--;
        }

        while(i<j && nums[i]<=key){  //左边找到一个大于key 的索引位置
            i++;
        }

        if(i<j) {             //交换两个位置的值
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }

    nums[left] = nums[i];
    nums[i] = key;
    // printf("sort a time, key value is %d", key);
    // printfArr(nums,13);

    //经过上面一轮循环, 右边的值全部大于左边的值

    //然后分两块区域, 继续进行排序
    _qsort(nums, left, i - 1);
    _qsort(nums, i+1, right);
}
Example #9
0
/** Quicksort wrapper
 *
 * This is only a wrapper that takes care of memory
 * allocations for storing the pivot and temporary elements
 * for generic quicksort algorithm.
 *
 * This function can sleep.
 *
 * @param data      Pointer to data to be sorted.
 * @param cnt       Number of elements to be sorted.
 * @param elem_size Size of one element.
 * @param cmp       Comparator function.
 * @param arg       3rd argument passed to cmp.
 *
 * @return True if sorting succeeded.
 *
 */
bool qsort(void *data, size_t cnt, size_t elem_size, sort_cmp_t cmp, void *arg)
{
	uint8_t ibuf_slot[IBUF_SIZE];
	uint8_t ibuf_pivot[IBUF_SIZE];
	void *slot;
	void *pivot;
	
	if (elem_size > IBUF_SIZE) {
		slot = (void *) malloc(elem_size, 0);
		if (!slot)
			return false;
		
		pivot = (void *) malloc(elem_size, 0);
		if (!pivot) {
			free(slot);
			return false;
		}
	} else {
		slot = (void *) ibuf_slot;
		pivot = (void *) ibuf_pivot;
	}
	
	_qsort(data, cnt, elem_size, cmp, arg, slot, pivot);
	
	if (elem_size > IBUF_SIZE) {
		free(pivot);
		free(slot);
	}
	
	return true;
}
/* qsort: sort v[left]...v[right] into increasing order */
void _qsort(void *v[], int left, int right, int (*comp) (void *, void *))
{
    int i, last;
    void swap(void *v[], int, int);

    if (left >= right) /* do nothing if array contains */
	return ;       /* fewer than two elements */
    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++) {
	if ((*comp) (v[i], v[left]) < 0)
	    swap(v, ++last, i);
    }
    swap(v, left, last);
    _qsort(v, left, last - 1, comp);
    _qsort(v, last + 1, right, comp);
}
Example #11
0
int main(int argc, char *argv[]) {
	int nlines;
	char c;
	int k = 0;
	while (--argc > 0 && (*++argv)[k] == '-')
		while ((++argv[k]) && (c = *argv[k]))
			switch (c) {
			case 'd':
				dflag = 1;
				break;
			case 'f':
				fflag = 1;
				break;
			case 'r':
				reverse = 1;
				break;
			case 'n':
				numeric = 1;
				break;
			default:
				printf("warning: illegal option %c\n", c);
				argc = 0;
				break;
			}
	if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
		if (fflag) {
			_qsort((void**) lineptr, 0, nlines - 1,
					(int(*)(void*, void*)) (numeric ? numcmp : myStrcmpf));
		} else
			_qsort((void**) lineptr, 0, nlines - 1,
					(int(*)(void*, void*)) (numeric ? numcmp : myStrcmp));
		writelines(lineptr, nlines);
		destroy((void**) lineptr, nlines);
		return 0;
	} else {
		nlines*=-1;
		printf("Error occurs on line %d\n",nlines);
		nlines--;
		destroy((void**) lineptr, nlines);
		return 1;
	}
}
Example #12
0
/**
 * @brief ascending array
 * @details recursive array sort, by compare
 * elements from head and tail and replace 
 * if element with smallest index more than element
 * with biggest index
 * 
 * @param v is array pointer to char arrays
 * @param left head pointer index
 * @param right tail pointer index
 */
void _qsort(char *v[], int left, int right){
	int 	i, last;
	void 	swap(char *v[], int i, int j);

	if(left >= right){
		// nothing to sort, all yet on self places
		return;
	} else {
		swap(v, left, (left+right)/2);  // get pivot as a middle
		last = left;
		printf("left:%d last:%d right:%d\n", last, left, right);
		for (i = left+1; i<= right; i++)
			if (strcmp(v[i], v[left]) < 0)
				swap(v, ++last, i);

		swap(v, left, last);
		_qsort(v, left, last-1);
		_qsort(v, last+1, right);
	}
}
Example #13
0
File: qsort.c Project: shixv/test
void _qsort(int* a,int left,int right) {
    if(left<right) {
        int i=left+1;
        int j=right;
        int temp=a[i];
        while(i<j) {
//			while(i<j&&a[j]>temp)j--;
//			if(i<j)a[i++]=a[j];
//			while(i<j&&a[i]<temp)i++;
//			if(i<j)a[j--]=a[i];
            while(i<j&&a[i]<temp)i++;
            while(i<j&&a[j]>temp)j--;
            if(i<j)Swap(a,i++,j--);
        }
//		a[i]=temp;
        Swap(a,left,i);
        _qsort(a,left,i-1);
        _qsort(a,i+1,right);
    }
}
Example #14
0
//void qsort (char *v[], int left, int right) {
void _qsort(void *v[], int left, int right, int (*comp)(void *, void *))
{
	int i, last;
	void swap(void *v[], int i, int j);
//	void swap(char *v[], int i, int j);

	if (left >= right)
		return;
	swap(v, left, (left + right) / 2);
	last = left;
	for (i = left + 1; i <= right; i++)
//		if (strcmp(v[i], v[left]) < 0)
//		if ((reverse ? ((*comp)(v[i], v[left]) > 0) : ((*comp)(v[i], v[left]) < 0)))
		if ((*comp)(v[i], v[left]) < 0)
			swap(v, ++last, i);
	swap(v, left, last);
//	qsort(v, left, last - 1);
	_qsort(v, left, last - 1, comp);
//	qsort(v, last + 1, right);
	_qsort(v, last + 1, right, comp);
}
Example #15
0
void idxSortWrt(struct conv c_list[], int len, FILE *fidx){
  int i;

  _qsort(c_list, 0, len - 1);

  for(i = 0; i < len; i++){
    fprintf(fidx, " <TD><A HREF=\"%s\">%s</A></TD><TD> </TD>", c_list[i].file, c_list[i].orig);
    if((i+1) % 5 == 0)
      fprintf(fidx, "\n</TR>\n<TR>\n");
  }

}
void _qsort(int low, int high) {

      int i = low,

          j = high,

          p = arr[ ( low + high ) >> 1 ];

          while(i <= j) {

                while(arr[ i ] < p) i++;

                while(arr[ j ] > p) j--;

                if( i <= j ) swap( &arr[ i++ ], &arr[ j-- ]);
          } 

          if(low < j) _qsort(low, j);

          if(i < high) _qsort(i, high);
};
Example #17
0
/* Text with leading underscore is compared from the next character */
void _qsort(struct conv c_list[], int first, int last){
  int i = first, j = last;
  char *med;
  struct conv swap;

  med = c_list[(first + last) / 2].orig;
  if(*med == '_'){
    med++;
  }

  do{
    while(strcasecmp((*c_list[i].orig == '_' ?
		      c_list[i].orig + 1 :
		      c_list[i].orig),
		     med) < 0){
      i++;
    }

    while(strcasecmp(med,
		     *c_list[j].orig == '_' ? 
		     c_list[j].orig + 1 :
		     c_list[j].orig) < 0){
      j--;
    }

    if(i <= j){
      swap = c_list[i];
      c_list[i++] = c_list[j];
      c_list[j--] = swap;
    }

  }while(i <= j);

  if(first < j)
    _qsort(c_list, first, j);
  
  if(i < last)
    _qsort(c_list, i, last);

}
Example #18
0
static SQInteger array_sort(HSQUIRRELVM v)
{
	SQInteger func = -1;
	SQObjectPtr &o = stack_get(v,1);
	SQObject &funcobj = stack_get(v,2);
	if(_array(o)->Size() > 1) {
		if(type(funcobj) == OT_CLOSURE || type(funcobj) == OT_NATIVECLOSURE) func = 2;
		if(!_qsort(v, o, 0, _array(o)->Size()-1, func))
			return SQ_ERROR;

	}
	return 0;
}
Example #19
0
File: sort.c Project: jo-va/yak
static void _qsort(void *array, size_t size, int (*cmp)(void *, void *), int low, int high)
{
    if (high > low) {
        int pivot_idx = ((low + high) / 2) / size * size;
        swap(array + low, array + pivot_idx, size); // place pivot at the beginning
        void *pivot = array + low;
        int l = low + size; // order from second element to end of partition
        int r = high;
        while (l < r) {
            if (cmp(array + l, pivot) <= 0) {
                l += size;
            } else {
                for (r -= size; l < r && cmp(array + r, pivot) >= 0; r -= size) { }
                swap(array + l, array + r, size);
            }
        }
        l -= size;
        swap(array + low, array + l, size);
        _qsort(array, size, cmp, low, l);
        _qsort(array, size, cmp, r, high);
    }
}
Example #20
0
/**
 * @brief read string from stdin
 * sort and print
 * @details fill pointer array *lineptr with pointers for 
 * read strings, sort that array and print sorted
 * strings with sorted pointers
 * @return 0 if sucess otherwise -1 if fail
 */
int main(void){
	int nlines;  // number of input strings
	char buffer[MAXLEN*MAXLINES]; // allocate place for possibly read strings

	if ( (nlines = readlines(lineptr, MAXLINES, buffer)) >= 0){
		_qsort(lineptr, 0, nlines-1);
		writelines(lineptr, nlines);
		return 0;
	} else {
		printf("input too big to sort\n");
		return -1;
	}

}
int main() {

    read();

    //freopen(FOUT, "w", stdout);        

    srand(time(NULL));

    _qsort(0, n - 1);

    int i;

    for(i = 0; i < n; i++) printf("%d ", arr[ i ]);

    fclose( stdout );

    return(0);
};
Example #22
0
File: qsort.c Project: shixv/test
void qsort(int* a,int len) {
    _qsort(a,0,len-1);
}
Example #23
0
void qsort(void *__base, int __nelem, int __size, int (*__cmp)(const void *__e1, const void *__e2)) {
    _qsort(__base, __nelem, __size, __cmp);
}
Example #24
0
/** string sorting from stdin */
int main (int argc, char *argv[])
{
	int nlines;
//	int numeric = 0;	// 1 -- string of numbers
//	int reverse = 0;	// 1 -- reverse order
//	int caseinsensitive = 0;// 1 -- case insensitive sort
//	int directory = 0;	// 1 -- directory order sort
	/** compare operation */
//	int (*comp)(void*,void*) = (int (*)(void*,void*))strcmp;
	int z;

	if (argc > 1) {
		int i,j;
		for (i = 1; i < argc; i++) {
//			if (argv[i][0] == '-' && argv[i][2] == '\0') {
//			if (argv[i][0] == '-' && argv[i][1] != '\0') {
			if (argv[i][0] == '-') {
				int empty_field = 1;
			        /** count all possible fields */
			        if (argv[i][1] == '\0') /** assume option '-\0' = base string sort */
					empty_field = 0;
//				fields_count++;
				for(j=1; argv[i][j] != '\0'; j++) {
					switch(argv[i][j]) {
					case 'n':
						options[field][NUMERIC] = 1;
						options[field][CASEINSENSITIVE] = 0;
						empty_field = 0;
						break;
					case 'r':
						options[field][REVERSE] = 1;
						empty_field = 0;
						break;
					case 'f':
						if (options[field][NUMERIC] == 0) {
							options[field][CASEINSENSITIVE] = 1;
							empty_field = 0;
						}
						break;
					case 'd':
						options[field][DIRECTORY] = 1;
						empty_field = 0;
						break;
					}
				}
				if (!empty_field) {
					fields_count++;
					field++;
				}
			}
		}
	}

	/** we can pass caseinsensitive-value if we sort strings as characters (not numeric) */
//	if (numeric)
//		caseinsensitive = 0;

	if (fields_count == 0) {
		printf("error: some options should be specified...\n");
		return 1;
	}
	else {
		if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
/*			int numeric = options[0][NUMERIC];
			int reverse = options[0][REVERSE];
			int caseinsensitive = options[0][CASEINSENSITIVE];
			int directory = options[0][DIRECTORY];
*/
//			qsort(lineptr, 0, nlines - 1);
//			_qsort((void **) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ? numcmp : strcmp), reverse);
/*
			if (numeric && reverse)
				comp = (int (*)(void*,void*))numcmp_reverse;
			else if (numeric)
				comp = (int (*)(void*,void*))numcmp;
			else if (caseinsensitive && reverse)
				comp = (int (*)(void*,void*))strcmp_reverse_incase;
			else if (reverse)
				comp = (int (*)(void*,void*))strcmp_reverse;
			else if (caseinsensitive && directory)
				comp = (int (*)(void*,void*))dircmp_incase;
			else if (directory)
				comp = (int (*)(void*,void*))dircmp;
			else if (caseinsensitive)
				comp = (int (*)(void*,void*))strcmp_incase;
*/
//			_qsort((void **) lineptr, 0, nlines-1, comp);
			_qsort((void **) lineptr, 0, nlines-1, (int (*)(void*,void*))comp_fielded);
//			printf("qsort for %s-input in %s order%s%s\n", numeric ? "numeric" : "character", reverse ? "reverse" : "straight", caseinsensitive ? " [case-insensitive]" : "", directory ? " [directory]" : "");

			printf("qsort for input by fields:\n");
			for (z = 0; z < fields_count; z++) {
				printf("\t [%d]: %s-input in %s order%s%s\n", z, options[z][NUMERIC] ? "numeric" : "character", options[z][REVERSE] ? "reverse" : "straight", options[z][CASEINSENSITIVE] ? " [case-insensitive]" : "", options[z][DIRECTORY] ? " [directory]" : "");
			}

			writelines(lineptr, nlines);
			return 0;
		}
		else {
			printf("error: input too big to sort\n");
			return 1;
		}
	}
//	return 0;
}
      void sort() {

           _qsort(0, N - 1); 
      };
Example #26
0
File: sort.c Project: jo-va/yak
void qsort(void *array, size_t nitems, size_t size, int (*cmp)(void *, void *))
{
    _qsort(array, size, cmp, 0, nitems * size);
}
Example #27
0
void qsort(void *base,size_t nmemb,size_t size,fCompare cmp) {
	_qsort(base,size,cmp,0,nmemb - 1);
}
void qsort() {

     _qsort(0, n - 1);
};
Example #29
0
void quickSort(int *a, int n) {
    _qsort(a, 0, n-1);
}
Example #30
0
/**
 * 快速排序
 */
void qsortArr(int* nums, int numsSize){
    _qsort(nums, 0, numsSize - 1);
}