sort()関数とqsort()関数


sort()関数は、C++のソート関数であり、ヘッダファイルは、#includeヘッダファイルである.
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;

}