只討論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]<<' ';
}
小結:
- sort()函數可以對數組和vector容器排序。排序的範圍是[begin,end)
- sort()默認是遞增排序。
- 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;
}
運行效果截圖:
一開始用鏈表+直接插入排序算法做,但是超時了。。代碼貼上,做個記錄吧
//時間複雜度太大
#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;
}