STL sort用法

只討論sort簡單使用方法

demo1

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	int a[] = {2, 5, 3, 4, 1};
	sort(a, a + 5);
	for(int i = 0; i < 5; i++)
		cout<<a[i]<<' ';
} 

demo2

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main()
{
	int a[] = {2, 5, 3, 4, 1};
	vector<int> v(a, a+5);
	sort(v.begin(), v.end());
	for(int i = 0; i < 5; i++)
		cout<<v[i]<<' ';
} 

小結:

  1. sort()函數可以對數組和vector容器排序。排序的範圍是[begin,end)
  2. sort()默認是遞增排序。
  3. vector可以這樣賦初值vector v(a, a+5);

demo3:自定義比較函數

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool myCompare(int a, int b)
{
	return a > b;
}
int main()
{
	int a[] = {2, 5, 3, 4, 1};
	vector<int> v(a, a+5);
	sort(v.begin(), v.end(), myCompare);
	for(int i = 0; i < 5; i++)
		cout<<v[i]<<' ';
} 

小結:
1.sort()函數中的自定義比較函數返回true的時候交換兩個數。
2.另外,傳入的參數會被交換!(可以理解爲:先交換,如果返回true,則確認此次交換過程;否則恢復之前的次序)比如

sort(v.begin(), v.begin()+2, myCompare);
//在myCpomare(int a, int b)中,a = v.begin()+1, b = v.begin()

所以執行sort(v.begin(), v.begin()+2, myCompare);
之後的vector爲5 2 3 4 1

demo4–對結構體排序

#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
    int x,y;
}p[1001];

bool cmp(Node a,Node b) {
    if (a.x != b.x) 
    	return a.x < b.x;  //如果a.x不等於b.x,就按x從小到大排
    return a.y < b.y;  //如果x相等按y從小到大排
}
int main() 
{
	int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) 
		scanf("%d%d", &p[i].x, &p[i].y);
    sort(p, p+n, cmp);
    printf("result:\n");
    for (int i = 0; i < n; i++) 
		printf("%d %d\n", p[i].x, p[i].y);
    return 0;
}

運行效果截圖:
在這裏插入圖片描述

來一道華科複試題目:
https://www.nowcoder.com/practice/7a2f7d304d9e43b1bb2a6e72ed65bf51?tpId=69&tqId=29662&tPage=1&ru=/kaoyan/retest/11002&qru=/ta/hust-kaoyan/question-ranking

一開始用鏈表+直接插入排序算法做,但是超時了。。代碼貼上,做個記錄吧

//時間複雜度太大 
#include<iostream>
#include<malloc.h>
#include<string.h>
using namespace std;

typedef struct st{
	char name[110];
	int age;
	int grade;
	struct st *next;
}student;

int main()
{
	int n;
	cin>>n;
	if(n == 0)
		return 0;
		
	student *pre, *p; 
	student *head = (student *)malloc(sizeof(student));
	head->next = NULL;//帶頭結點的 
	
	for(int i = 0; i < n; i++)
	{
		p = (student *)malloc(sizeof(student));
		cin>>p->name>>p->age>>p->grade;
		pre = head;
		while(pre->next != NULL)
		{
			if(pre->next->grade < p->grade)
				pre = pre->next;
			else if(pre->next->grade > p->grade)
			{
				p->next = pre->next;
				pre->next = p;
				break;
			}
			else//成績相等 
			{
				int tt = strcmp(pre->next->name, p->name);
				if(tt < 0)
					pre = pre->next;
				else if(tt > 0)
				{
					p->next = pre->next;
					pre->next = p;
					break;
				}
				else//成績和姓名均相等 
				{
					if(pre->next->age < p->age)
						pre = pre->next;
					else if(pre->next->age > p->age)
					{
						p->next = pre->next;
						pre->next = p;
						break;
					}
				}
			}
		}
		if(pre->next == NULL)
		{
			p->next = pre->next;
			pre->next = p;
		}
	}
	p = head->next;
	while(p != NULL)
	{
		cout<<p->name<<' '<<p->age<<' '<<p->grade<<endl;
		p = p->next;
	}
	return 0;
}

用sort()做:

//sort
#include<iostream>
#include<malloc.h>
#include<string.h>
#include<algorithm>
using namespace std;

typedef struct st{
	char name[110];
	int age;
	int grade;
}student;
bool comp(student a, student b)
{
	if(a.grade != b.grade)
		return a.grade < b.grade;
	else  //分數相等 
	{
		int tt = strcmp(a.name, b.name);//小於,等於,大於,分別返回-1 0 1 
		if(tt != 0)
			return tt < 0;
		else //分數和姓名相同 
			return a.age < b.age;
	}
}
int main()
{
	int n;
	cin>>n;
	if(n == 0)
		return 0;
	student *nodes = (student *)malloc(sizeof(student) * n);
	for(int i = 0; i < n; i++)
		cin>>nodes[i].name>>nodes[i].age>>nodes[i].grade;
		
	sort(nodes, nodes+n, comp);
	
	for(int i = 0; i < n; i++)
		cout<<nodes[i].name<<' '<<nodes[i].age<<' '<<nodes[i].grade<<endl;
		
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章