C++sort関数の様々な使い方

3104 ワード

C++には使いやすいライブラリ関数がたくさんあります
使いやすくて速い
sortという関数が一番好きです
でもよく覚えてる使い方
ここでまとめます
勉強しやすい
Sort()関数はC++の1つのソート方法の1つで、この方法をマスターしても私がC++を勉強してから使った泡のソートとソートを選択することによる実行効率が高くない問題を解消します!並べ替え方法は、高速並べ替え方法に似ているため、時間的複雑度はn*log 2(n)であり、実行効率が高い.
(1)Sort()関数のヘッダファイルは#include
(2)Sort関数には3つのパラメータがあります.
1つ目は、ソートする配列の開始アドレスです.
2つ目は終了アドレス(最後にソートするアドレス)です.
3番目のパラメータはソート方法で、小さいときから大きいときも小さいときも、3番目のパラメータを書かないときのデフォルトのソート方法は小さいときから大きいときにソートできます.
sort降順ソートコード:
#include
#include
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int a[10]={2,5,3,0,1,5,6,2,8,4};
	printf("   :");
	for(int i=0;i<10;i++)
		printf("%d ",a[i]);
	sort(a,a+10,cmp);
	printf("
"); printf(" :"); for(int i=0;i<10;i++) printf("%d ",a[i]); printf("
"); return 0; }

もちろん、関数を書きたくなければ、C++標準ライブラリの強力な機能はこの問題を完全に解決することができます.
less()/昇順ソート
greater()/降順ソート
例えば、sort(a,a+10,less();
   sort(a,a+10,greater());
sort関数は,ASCII符号値に基づいて文字を並べ替えることも可能であり,データ型をcharに変更するだけでよい.
sort関数による構造体のソート
#include
#include
using namespace std;
struct student
{
	int grade;
	int num_id;
}stu[10];
bool cmp(struct student a,struct student b)
{
	if(a.grade!=b.grade)
		return a.grade>b.grade;		//      ,      
	else
		return a.num_id>b.num_id;	//     ,      
}
int main()
{
	for(int i=0;i<10;i++)
		scanf("%d %d",&stu[i].grade,&stu[i].num_id);
	sort(stu,stu+10,cmp);
	printf("  \t\t  
"); for(int i=0;i<10;i++) printf("%d\t\t%d
",stu[i].grade,stu[i].num_id); return 0; }

sort関数pair配列のソート
関数を書かない場合はsort関数を使用してpair配列を並べ替え、デフォルトではfirstで昇順に並べ替えます
もちろんある値を他の値で並べ替えたい場合はcmp関数を書かなければなりません
フォーマット上は上のものと大きな違いはありません
パラメータの書き方に注意すればいいです
例:
typedef pair P;
bool cmp(const P &a, const P &b)   //P pair  
{
    if (a.first < b.first)
        return true;
    else return false;
}

sort関数による文字配列のソート
杭電1862 EXCELソートhttp://acm.hdu.edu.cn/showproblem.php?pid=1862
#include
#include
#include
using namespace std;
struct student
{
    char stuID[10];
    char name[10];
    int grade;
}stu[100005];
bool cmp1(struct student a,struct student b)
{
    return strcmp(a.stuID,b.stuID)<0;
}
bool cmp2(struct student a,struct student b)
{
    if(strcmp(a.name,b.name)==0)
        return strcmp(a.stuID,b.stuID)<0;
    else
        return strcmp(a.name,b.name)<0;
}
bool cmp3(struct student a,struct student b)
{
    if(a.grade==b.grade)
        return strcmp(a.stuID,b.stuID)<0;
    else
        return a.grade

cmp関数の書き方には固定的なテンプレートはありませんが、実際の状況に応じて柔軟に書く必要があります.