プログラミング基礎---qsort関数のソート

3309 ワード

qsort関数は、stdlibに宣言するANSI C規格で提供される.hファイルには、
2つの配布に基づいて書かれており、その時間複雑度はn*log(n)であり、その構造は以下の通りである.
void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));
次のようになります.
*baseはソートする配列です
nelemはソートする配列の長さです
widthは配列要素のサイズ(1バイト単位)
デフォルトは小さいものから大きいものまで並べ替えられています!
(*Comp)(const void*a,const void*b)は、サイズ関数を判断するポインタであり、
この関数は自分で定義する必要があります.
場合
a>b、関数は-1を返します.
aa==b関数は0を返します
ソート方法には、ソートの選択、バブルソート、集計ソート、クイックソートなどがあります.
これは、比較関数を定義することによって行うことができます.
比較関数の役割はqsortに要素の大きさがどのように比較されているかを示すことである.
このような比較関数
inline int MyCmp(const void* a, const void* b)
パラメータとして2つの要素があり、int値を返します.
比較関数が0より大きいとqsortはa>bとし,
比較関数が0 qsortに等しいとするとaとbの2つの要素が等しいとみなされ、
ゼロ未満qsortを返すとa比較関数を本来1のはずに戻すと(a>b)、
関数を比較して-1(ゼロ未満)を返すとqsortはabを前に置くが、実際にはaがbより大きいため、昇降順の違いが生じる.
例:
#include <stdlib.h>
#include <iostream>
using namespace std;

int compare_up(const void *a, const void *b);
int compare_down(const void *a, const void *b);

int main()
{
	int a[] = {2, 4, 20, 12,12, 45};
	int i;

	qsort((void *)a, 6, sizeof(int), compare_up);
	for(i = 0; i < 6; i++)
	{
		cout<<a[i]<<endl;
	}

	cout<<endl;

	qsort((void *)a, 6, sizeof(int), compare_down);
	for(i = 0; i < 6; i++)
	{
		cout<<a[i]<<endl;
	}
	return 0;
}

int compare_up(const void *a, const void *b)
{
	return *(int*)a >= *(int*)b ? 1 : -1; 
}

int compare_down(const void *a, const void *b)
{
	return *(int*)a < *(int*)b ? 1 : -1; 
}

その他の例:
7つのqsortソート方法<本明細書でソートするのはすべて小さいから大きいまでソートする>1、intタイプ配列に対してint numをソートする[100].Sample:int cmp(const void*a,const void*b){return*(int*)a-*(int*)b;//強制変換タイプ}qsort(num,100,sizeof(num[0]),cmp);二、charタイプ配列のソート(intタイプと同じ)char word[100].Sample: int cmp( const void *a , const void *b ) { return *(char *)a - *(char *)b; } qsort(word,100,sizeof(word[0]),cmp); 三、doubleタイプ配列のソート(特に注意)double in[100].int cmp( const void *a , const void *b ) { return *(double *)a > *(double *)b ? 1 : -1; } qsort(in,100,sizeof(in[0]),cmp); 四、構造体に対してstruct In{double data;int other;s[100];//dataの値が小さいときから大きいときに構造体を並べ替えると、構造体内の並べ替えに関するキーデータdataのタイプが様々になります.上の例を参考にint cmp(const void*a,const void*b){return(*(In*)a).data>(*(In*)b).data?1:-1;)qsort(s,100,sizeof(s[0]),cmp); 五、構造体の二次順序struct In{int x;int y;}s[100]; //xが小さい順に並べ替えられ、xが等しいときyが大きい順にint cmp(const void*a,const void*b){struct In*c=(In*)a;struct In*d=(In*)b;if(c->x!=d->x)return c->x-d->x;else returnd->y-c->y;}qsort(s,100,sizeof(s[0]),cmp); 六、文字列を並べ替えるstruct In{int data;char str[100];s[100]; //構造体の文字列strの辞書順にint cmp(const void*a,const void*b){return strcmp((*(In*)a)->str,(*(In*)b)->str);}qsort(s,100,sizeof(s[0]),cmp); 七、計算幾何学の中で凸包のcmp int cmp(const void*a,const void*b)/重点cmp関数を求めて、1点以外のすべての点を、回転角度ソート{struct point*c=(point*)a;struct point*d=(point*)b;if(calc(**c,*d,*d,[1])<0)return 1;else if(!calc(**c,*d,*d,[1])&&dis(c->x,c->y,p[1].x,p[1].x,p[1].y)x,d->y,d->y,p[1].x,p[1].x,p[1].y)//一直線上にある場合は遠くの方を前に置くreturn 1;else return 1;else return-1;}