- #include <stdio.h> 
- #include <stdlib.h> 
- #include <string.h> 
-   
- int compare_int( void *a,  void *b) 
- { 
- 	int *c = a; 
- 	int *d = b; 
- 	return *c - *d; 
- } 
-   
- int compare_string( void *a,  void *b) 
- { 
- 	 char *c = a; 
- 	 char *d = b; 
- } 
-   
- int compare_string_v2( void *a,  void *b) 
- { 
- 	 char **c = a; 
- 	 char **d = b; 
- } 
-   
- void bubble_sort (void* base, size_t num, size_t width,int (*compar)( void*, void*)) 
- { 
- 	int i,j,k; 
- 	unsigned char *ptr = base; 
- 	unsigned char tmp[256]; 
-   
- 	if(num < 2 || width == 0) 
- 		return; 
-   
- 	for(i = num-1; i > 0; i--) /* 1*/ 
- 	{ 
- 		for(j = 1; j <= i; j++) 
- 		{ 
-   		    k = compar(ptr + width * (j-1), ptr + width * j); 
- 			if(k > 0) 
- 			{ 
- 				memcpy(- tmp ,-  ptr  +-  width *(- j -1),-  width );
 
- 				memcpy(- ptr  +-  width *(- j -1),-  ptr  +-  width *- j ,-  width );
 
- 				memcpy(- ptr  +-  width  *-  j ,-  tmp ,-  width );
 
- 			} 
- 		} 
- 	} 
- } 
-   
- int main(){ 
-      int a[] = {1, 3, 4, 52, 2, 3}; 
-      char a2[5][20] = { "jhsa", "asndb", "drtfe", "nhurh", "bvhr"}; 
-      char *a3[] = { "jhsa", "asndb", "drtfe", "nhurh", "bvhr"};  
-      int i = 0; 
-      bubble_sort (a, 6, sizeof(int), compare_int);     
-      for(i = 0; i < 6; i++){ 
-      } 
-      bubble_sort (a2, 5, 20, compare_string);     
-      for(i = 0; i < 5; i++){ 
-      } 
-      printf("\n\nsort array of strings:\n\n"); 
-      bubble_sort (a3, 5, sizeof(char*), compare_string_v2);     
-      for(i = 0; i < 5; i++){ 
-      } 
-   
-      return 0;  
- } 
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKaW50IGNvbXBhcmVfaW50KCB2b2lkICphLCAgdm9pZCAqYikKewoJaW50ICpjID0gYTsKCWludCAqZCA9IGI7CglyZXR1cm4gKmMgLSAqZDsKfQoKaW50IGNvbXBhcmVfc3RyaW5nKCB2b2lkICphLCAgdm9pZCAqYikKewoJIGNoYXIgKmMgPSBhOwoJIGNoYXIgKmQgPSBiOwoJcmV0dXJuIHN0cmNtcChjLCBkKTsKfQoKaW50IGNvbXBhcmVfc3RyaW5nX3YyKCB2b2lkICphLCAgdm9pZCAqYikKewoJIGNoYXIgKipjID0gYTsKCSBjaGFyICoqZCA9IGI7CglyZXR1cm4gc3RyY21wKCpjLCAqZCk7Cn0KCnZvaWQgYnViYmxlX3NvcnQgKHZvaWQqIGJhc2UsIHNpemVfdCBudW0sIHNpemVfdCB3aWR0aCxpbnQgKCpjb21wYXIpKCB2b2lkKiwgdm9pZCopKQp7CglpbnQgaSxqLGs7Cgl1bnNpZ25lZCBjaGFyICpwdHIgPSBiYXNlOwoJdW5zaWduZWQgY2hhciB0bXBbMjU2XTsKCglpZihudW0gPCAyIHx8IHdpZHRoID09IDApCgkJcmV0dXJuOwoKCWZvcihpID0gbnVtLTE7IGkgPiAwOyBpLS0pIC8qIDEqLwoJewoJCWZvcihqID0gMTsgaiA8PSBpOyBqKyspCgkJewogIAkJICAgIGsgPSBjb21wYXIocHRyICsgd2lkdGggKiAoai0xKSwgcHRyICsgd2lkdGggKiBqKTsKCQkJaWYoayA+IDApCgkJCXsKCQkJCW1lbWNweSh0bXAsIHB0ciArIHdpZHRoKihqLTEpLCB3aWR0aCk7CgkJCQltZW1jcHkocHRyICsgd2lkdGgqKGotMSksIHB0ciArIHdpZHRoKmosIHdpZHRoKTsKCQkJCW1lbWNweShwdHIgKyB3aWR0aCAqIGosIHRtcCwgd2lkdGgpOwoJCQl9CgkJfQoJfQp9CgppbnQgbWFpbigpewogICAgIGludCBhW10gPSB7MSwgMywgNCwgNTIsIDIsIDN9OwogICAgIGNoYXIgYTJbNV1bMjBdID0geyAiamhzYSIsICJhc25kYiIsICJkcnRmZSIsICJuaHVyaCIsICJidmhyIn07CiAgICAgY2hhciAqYTNbXSA9IHsgImpoc2EiLCAiYXNuZGIiLCAiZHJ0ZmUiLCAibmh1cmgiLCAiYnZociJ9OyAKICAgICBpbnQgaSA9IDA7CiAgICAgYnViYmxlX3NvcnQgKGEsIDYsIHNpemVvZihpbnQpLCBjb21wYXJlX2ludCk7ICAgIAogICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKyl7CiAgICAgICAgcHJpbnRmKCJcbiVkIiwgYVtpXSk7CiAgICAgfQogICAgIGJ1YmJsZV9zb3J0IChhMiwgNSwgMjAsIGNvbXBhcmVfc3RyaW5nKTsgICAgCiAgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKXsKICAgICAgICBwcmludGYoIlxuJXMiLCBhMltpXSk7CiAgICAgfQogICAgIHByaW50ZigiXG5cbnNvcnQgYXJyYXkgb2Ygc3RyaW5nczpcblxuIik7CiAgICAgYnViYmxlX3NvcnQgKGEzLCA1LCBzaXplb2YoY2hhciopLCBjb21wYXJlX3N0cmluZ192Mik7ICAgIAogICAgIGZvcihpID0gMDsgaSA8IDU7IGkrKyl7CiAgICAgICAgcHJpbnRmKCIlc1xuIiwgYTNbaV0pOwogICAgIH0KICAgICAgCiAgICAgcmV0dXJuIDA7IAp9