排序
冒泡排序
for (int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++){
//由于i=0时,j作为两两比较元素的下标,需要比较从j=0到n-1,
//完成比较后此时第一个最小元素已经不需要比较了,
//所以i每次增加1,已经做过大小比较的元素增加1,所以j的范围是从0到n-1-i
if(buf[j]>buf[j+1]){
int tmp=buf[j];
buf[j]=buf[j+1];
buf[j+1]=tmp;
//实现相邻元素按从小到大排序
}
}
}
考虑时间O(n)=n^2和空间复杂性 O(n)=n*单个存储单元内存32bit,使用快速排序、归并排序
快速排序
头——#include<algorithm.h>
目的:sort库函数
c中有qsort函数
using namespace std;
int main(){
sort(buf,buf+n);//待排序内存的起始地址和结束地址
}
用sort实现降序——升序的倒序
bool cmp (int x,int y) {
//定义排序规则
return x > y;
}
int main () {
sort (buf,buf + n,cmp);
//使用该重载形式,自义的排列规则
//当 cmp 的返回值为 true 时,
// 即表示 cmp 函数的第一个参数将会排在第二个参数之前
}
sort完成数组排序
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct E {
char name[101];
int age;
int score;
}buf[1000];
bool cmp(E a,E b) {
//实现比较规则
if (a.score != b.score)
return a.score < b.score;
//若分数不相同则分数低者在前
int tmp = strcmp(a.name,b.name);
if (tmp != 0)
return tmp < 0;
//若分数相同则名字字典序小者在前
else return a.age < b.age;
//若名字也相同则年龄小者在前
}
int main () {
...
sort(buf,buf + n,cmp);//定义规则对数组进行排序
...
return 0;
}
重载<符号实现排序
bool operator < (const E &b) const { //算符重载直
if (score != b.score)
return score < b.score;
int tmp = strcmp(name,b.name);
if (tmp != 0)
return tmp < 0; //返回tmp与0比较的T与F
else return age < b.age;
}
}buf[1000];
int main () {
...
sort(buf,buf + n,cmp);//定义规则对数组进行排序
...
return 0;
}