写在最前面的
在csdn上开了一个博客,一直就听说这里挺火的,更重要的是,能和大牛们学习,受益匪浅啊。我非常喜欢UI编程,对VC很热衷,同时我也喜欢上了算法,但是数学一直是个瓶颈,一直都是“半桶水”,尽管如此,我还是会在博客中写写讨论有关UI和算法的学习笔记(算不上是什么文章咯。^_^),希望可以共同学习进步。
另外,外链一个博客,捣乱小子,这是我的同名博客,以前一直在那里混。下面是我的第一篇,特别水啊...在c/c++当中,有很多的模板可以用。下面介绍一下sort和qsort,学习笔记。
sort和qsort的使用
sort和qsort的使用方法。
template<class RandomAccessIterator>
void sort(
RandomAccessIterator _First,
RandomAccessIterator _Last
);
template<class RandomAccessIterator, class Predicate>
void sort(
RandomAccessIterator _First,
RandomAccessIterator _Last,
Predicate _Comp
);
在MSDN上如是说,来个最简单的数组排序。
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int &a,int &b)
{
return a<b;
}//返回true是升序,返回false是降序
void show(int *a,int n)
{
for(int i=0; i<n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
//测试数据
int a[5] = {5,4,3,2,1};
sort(a,a+5,cmp);
show(a,5);
}
sort不仅仅基于基本数据类型的排序。假设,有一个学生信息的数据结构:
struct student
{
int num;
char name[20];
int mark;
}s[100];
接着,假想s[100]已经填充了数据,有需求要将100个学生按照mark成绩的顺序来排序,那么同样可以用上面的方法来解决。但是在cmp函数需要小小的修改,学号和姓名会随着成绩“走”。
bool cmp(student &a,student &b)
{
return a.mark<b.;
}//返回true是升序,返回false是降序
又有需求,如果两个学生的成绩相同,则相同成绩的学生排序需要按照学生姓名的字典顺序(abcd...不分大小写)来排序。同样修改cmp就可以。
bool cmp(student &a,student &b)
{
if(a.mark==b.mark)
return strcmp(a.name,b.name);
return a.mark<b.mark;
}//返回true是升序,返回false是降序
qsort听说比sort低效,不是很清楚,但是也经常用。MSDN上如是说:
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
简单数组排列的例子:
#include <iostream>
#include <algorithm>
using namespace std;
int cmp(const void * a,const void * b)
{
int * pa = (int *)a,
* pb = (int *)b;
return *pa-*pb;
}
void show(int *a,int n)
{
for(int i=0; i<n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[5] = {5,4,3,2,1};
//sort(a,a+5,cmp);
qsort(a,5,sizeof(int),cmp);
show(a,5);
}
同样,学生成绩排序情况也可以这样。主要是修改cmp
int cmp(const void * a,const void * b)
{
student * pa = (student *)a,
* pb = (student *)b;
if(pa->mark==pb->mark)
return strcmp(pa->name,pb->name);
return pa->mark-pb->mark;
}
都是算法里面的模板来的,做题的时候用得着。
本文完。2012-03-19
捣乱小子 http://blog.csdn.net/daoluanxiaozi