sort()関数とqsort()関数
sort()関数は、C++のソート関数であり、ヘッダファイルは、#includeヘッダファイルである.
qsort()は、Cにおけるソート関数である、ヘッダファイルは、#include
1、qsort()----六種類のqsort並べ替え方法
qsort関数は使いやすいが、構造体1級ソート、2級ソート、文字列ソートなどはあまり使わない場合がある.
関数のプロトタイプ:
パラメータを入力:
Base:ソート対象配列
nelem:配列要素数の個数(長さ)
width:各要素が占めるストレージ領域のサイズ
fcmp:配列要素を比較するための関数のポインタ(この関数は自分で書く)、戻り値は1または-1(p 1>p 2は-1、p 1
2、sort()
sort所与の区間のすべての要素をソートする
stable_sortは所与の区間のすべての要素を安定に並べ替える
partial_sort指定区間のすべての要素の部分をソート
partial_sort_copy指定された区間をコピーしてソート
nth_element所定の区間のある位置に対応する要素を探し出す
is_sortedは1つの区間が順序付けされているかどうかを判断する
partitionはある条件に合致する要素を前に置く
stable_partitionはある条件に合致する元素を前に置くように比較的安定している.
構文は次のように記述されます.
qsort()は、Cにおけるソート関数である、ヘッダファイルは、#include
1、qsort()----六種類のqsort並べ替え方法
qsort関数は使いやすいが、構造体1級ソート、2級ソート、文字列ソートなどはあまり使わない場合がある.
関数のプロトタイプ:
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void*,const void *))
パラメータを入力:
Base:ソート対象配列
nelem:配列要素数の個数(長さ)
width:各要素が占めるストレージ領域のサイズ
fcmp:配列要素を比較するための関数のポインタ(この関数は自分で書く)、戻り値は1または-1(p 1>p 2は-1、p 1
出力パラメータ:baseを昇順に並べ替え
以下はその具体的な分類と用法である(具体的な説明がなければ降順で配列する):
(1)次元配列のソート:
(Element_typeは、1つの配列に格納されるデータ型であり、char,int,float,double,ectであってもよい)
int comp(const void *p1,const void *p2)
{
return *((Element_type*)p2)>*((Element_type*)p1)?1:-1;
}
int main()
{
Element_type list[MAX];
initial(list);// list[max]
qsort(list, sizeof(list),sizeof(Element_type),Comp);// qsort
return 0;
}
(2) :
int Comp(const void *p1,const void *p2)
{
return strcmp((char *)p2,(char *)p1);
}
int main()
{
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp);
//lenth a
}
(3) ( ):
struct Node
{
double data;
int other;
}s[100];
int Comp(const void *p1,const void *p2)
{
return (*(Node *)p2)->data > (*(Node *)p1)->data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),Comp);
(4) ( )[ ]:
struct Node
{
int x;
int y;
}s[100];
// x , x y ( 3 4 )
int Comp(const void *p1,const void *p2)
{
struct Node *c=(Node *)p1;
struct Node *d=(Node *)p2;
if(c->x!=d->x)
return c->x-d->x;
else
return d->y - c->y;
}
(5) :
struct Node
{
int data;
char str[100];
}s[100];
// str
int Comp(const void *p1,const void *p2)
{
return strcmp((*(Node *)p1).str,(*(Node *)p2).str);
}
qsort(s,100,sizeof(s[0],Comp);
(6) Comp
int Comp(const void *p1,const void *p2)// Comp , 1
{
struct point *c=(point *)p1;
struct point *d=(point *)p2;
if( cacl(*c, *d,p[1])<0)
return 1;
else if(!cacl(*c, *d, p[1]) && dis(c->x,c->y,p[1].x,p[1].y)<dis(d->x,d->y,p[1].x,p[1].y ) )
// ,
return 1;
else
return -1;
}
2、sort()
sort所与の区間のすべての要素をソートする
stable_sortは所与の区間のすべての要素を安定に並べ替える
partial_sort指定区間のすべての要素の部分をソート
partial_sort_copy指定された区間をコピーしてソート
nth_element所定の区間のある位置に対応する要素を探し出す
is_sortedは1つの区間が順序付けされているかどうかを判断する
partitionはある条件に合致する要素を前に置く
stable_partitionはある条件に合致する元素を前に置くように比較的安定している.
構文は次のように記述されます.
(1)sort(begin,end), , :
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
a , ? 。
(2)sort(begin,end,compare)
, sort:sort(begin,end,compare) 。 list , , compare sort , :sort(compare)。
1) compare :
bool compare(int a,int b)
{
return a<b; // , return a>b,
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,compare);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
2) , 。 , , , 。
, EnumComp 。 :
enum Enumcomp{ASC,DESC};
。 “<” “>”。
class compare
{
private:
Enumcomp comp;
public:
compare(Enumcomp c):comp(c) {};
bool operator () (int num1,int num2)
{
switch(comp)
{
case ASC:
return num1<num2;
case DESC:
return num1>num2;
}
}
};
sort(begin,end,compare(ASC)) ,sort(begin,end,compare(DESC)) 。
:
int main()
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,compare(DESC));
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
3) ( “<”、“>” ), 。 , functional ,include 。functional 。 ( ):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。 ,greater less , :
:sort(begin,end,less<data-type>());
:sort(begin,end,greater<data-type>()).
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,greater<int>());
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
4) , string , :
int main()
{
string str("cvicses");
string s(str.rbegin(),str.rend());
cout << s <<endl;
return 0;
}