c/c++でのソートの使用-qsort

4240 ワード

qsort
qsortはヘッダファイル#includeでは、関数のプロトタイプは以下の通りです.
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );


void*baseは、ソートされる配列が必要な最初のアドレスを指すポインタです.
size_t numはbaseポインタが指す配列に含まれる要素の個数、すなわち配列の大きさである
comparatorは関数を指すポインタで、関数の戻りタイプはintで、関数には2つのvoid*タイプのパラメータがあり、使用中に特定のタイプのポインタに下に移動する必要があります.例えば
int compare(const void* a,const void* b){
	return *(int*)a-*(int*)b;
}

2つのintタイプの要素を比較する必要がある場合は、void*ポインタをint*に変換する必要があります.*(int*)は配列内の整数値を表し、1番目のパラメータaが2番目のパラメータbより大きいと判断した場合は、正の値を返します.そうしないと負の値を返します.昇順ソートには、1番目のパラメータから2番目のパラメータを減算する必要があります.降順ソートには、2番目のパラメータから1番目のパラメータを減算する必要があります.
使用例は次のとおりです.
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct product{
	char name[16];
	float price;
};

int array_int[5]={4,1,2,5,3};
char array_char[5]={'a','c','b','e','d'};
double array_double[5]={1.2,2.3,5.2,4.6,3.5};
//      
int compare_int(const void* a,const void* b){
	return *(int*)a-*(int*)b;
}
//      
int compare_char(const void* a,const void* b){
	return *(char*)a-*(char*)b;
}
//      
int compare_double(const void* a,const void* b){
	return *(double*)a>*(double*)b?1:-1;
}
//      (            )
int compare_struct_float(const void*a,const void*b){
	struct product* ia=(struct product*)a;
	struct product* ib=(struct product*)b;
	return ia->price>ib->price?1:-1;
}
//      (           )
int compare_struct_str(const void*a,const void*b){
	struct product* ia=(struct product*)a;
	struct product* ib=(struct product*)b;
	return strcmp(ia->name,ib->name);
}
//    
void print_int(const int* a,int length){
	printf("      int  :
"); for(int i=0; i<length-1; i++) printf("%d ",a[i]); printf("%d
",a[length-1]); } void print_char(const char* a,int length){ printf(" char :
"); for(int i=0; i<length-1; i++) printf("%c ",a[i]); printf("%c
",a[length-1]); } void print_double(const double* a,int length){ printf(" double :
"); for(int i=0; i<length-1; i++) printf("%.2f ",a[i]); printf("%.2f
",a[length-1]); } void print_struct_array(struct product *array, int length) { for(int i=0; i<length; i++) printf("[ name: %s \t price: $%.2f ]
", array[i].name, array[i].price); puts("--"); } void main() { struct product structs[] = {{"mp3 player", 299.0f}, {"plasma tv", 2200.0f}, {"notebook", 1300.0f}, {"smartphone", 499.99f}, {"dvd player", 150.0f}, {"matches", 0.2f }}; // qsort(array_int,5,sizeof(array_int[0]),compare_int); print_int(array_int,5); // qsort(array_char,5,sizeof(array_char[0]),compare_char); print_char(array_char,5); // qsort(array_double,5,sizeof(array_double[0]),compare_double); print_double(array_double,5); // int len = sizeof(structs)/sizeof(struct product); qsort(structs,len,sizeof(struct product),compare_struct_float); printf(" float sturct :
"); print_struct_array(structs, len); // qsort(structs,len,sizeof(struct product),compare_struct_str); printf(" sturct :
"); print_struct_array(structs, len); }

参照先:
http://apps.hi.baidu.com/share/detail/2056555.
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
http://www.anyexample.com/programming/c/qsort__sorting_array_of_strings__integers_and_structs.xml
http://www.cnblogs.com/yeye518/archive/2011/10/07/2231607.html