zoukankan      html  css  js  c++  java
  • C语言qsort()函数的实现

    #include <stdio.h>
    void qsort(void * base, int num, int width, int (*comp)(const void *, const void *));
    void sort(char * lo, char * hi, int (*comp)(const void *, const void *), int width);
    char * partition(char * lo, char * hi, int (*comp)(const void *, const void *), int width);
    void swap(char * a, char * b, int width);
    int mycomp(const void * p1, const void * p2);
    
    int main(void) {
    	int i;
        int a[10] = {5, 3, 2, 9, 12, 6, 7, 10, 11, 1};
    	qsort(a, 10, 4, mycomp);
    	for (i = 0; i < 10; i++)
    		printf("%d ", a[i]);
    	printf("
    ");
    
    	return 0;
    }
    
    int mycomp(const void * p1, const void * p2) {
    	const int * a1 = (const int *) p1; 
    	const int * a2 = (const int *) p2;
    	if (*a1 < *a2)	
    		return -1;
    	else if (*a1 == *a2)
    		return 0;
    	else 
    		return 1;
    }
    
    void qsort(void * base, int num, int width, int (*comp)(const void *, const void *)) {
        char * lo = (char *) base;
        char * hi = (char *) base;
        hi += (num - 1) * width;
        sort(lo, hi, comp, width);
    }
    
    void sort(char * lo, char * hi, int (*comp)(const void *, const void *), int width) {
        char * p;
        if (lo >= hi)    return;
    
        p = partition(lo, hi, comp, width);
        sort(lo, p - width, comp, width);
        sort(p + width, hi, comp, width);
    }
    
    char * partition(char * lo, char * hi, int (*comp)(const void *, const void *), int width) {
        char * i = lo;
    	char * j = hi;
    
        while (i <= j) {
            do {
                i += width;
                if (i == hi)   break;
            } while ((*comp)(i, lo) < 0);
            
            while (1) {
    			if ((*comp)(j, lo) <= 0)
    				break;
    			j -= width;
    		}
            
            if (i <= j) 
                swap(i, j, width);
        }        
        swap(j, lo, width);
        return j;
    }
    
    //swap one byte at a time
    void swap(char * a, char * b, int width) {
        char tmp;
        while (width--) {
            tmp = *a;
            *a++ = *b;
            *b++ = tmp;
        }
    }

  • 相关阅读:
    socket (一)
    yield生成器及字符串的格式化
    python模块(json和pickle模块)
    python标准模块(time、datetime及hashlib模块)
    python标准模块(os及sys模块)
    python模块简介
    python --> 正则表达式
    python --> 递归 以及装饰器
    python基础知识(四)
    python基础知识(三)
  • 原文地址:https://www.cnblogs.com/zhayujie/p/7534858.html
Copyright © 2011-2022 走看看