• 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;
        }
    }

  • 相关阅读:
    IntelliJ IDEA 2020.1.1中java web项目的配置
    Js查漏补缺10-数组、栈、队列、回调函数等
    Js查漏补缺09-this对象
    Js查漏补缺08-闭包
    Js查漏补缺07-匿名函数应用到的框架
    Js查漏补缺06-匿名函数的用法
    Js查漏补缺05-函数
    Js查漏补缺04-Object类型
    Js查漏补缺03-循环结构
    Runnabler
  • 原文地址:https://www.cnblogs.com/zhayujie/p/7534858.html
Copyright © 2020-2023  润新知