常用函数:
C/C++中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为:
void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
使用该函数,可以对任何类型的一维数组排序。该函数参数中,base 是待排序数组的起始地址,nelem 是待排序数组的元素个数,width 是待排序数组的每个元素的大小(以字节为单位),最后一个参数 pfCompare 是一个函数指针,它指向一个“比较函数”。排序就是一个不断比较并交换位置的过程。qsort 如何在连元素的类型是什么都不知道的情况下,比较两个元素并判断哪个应该在前呢?答案是,qsort 函数在执行期间,会通过pfCompare指针调用一个 “比较函数”,用以判断两个元素哪个更应该排在前面。这个“比较函数”不是C/C++的库函数,而是由使用qsort 的程序员编写的。在调用qsort 时, 将“比较函数”的名字作为实参传递给pfCompare。程序员当然清楚该按什么规则决定哪个元素应该在前,哪个元素应该在后,这个规则就体现在“比较函数”中。
qsort 函数的用法规定,“比较函数”的原型应是:int 函数名(const void * elem1, const void * elem2);该函数的两个参数,elem1 和elem2,指向待比较的两个元素。也就是说, * elem1 和* elem2 就是待比较的两个元素。该函数必须具有以下行为:
1) 如果 * elem1 应该排在 * elem2 前面,则函数返回值是负整数(任何负整数都行)。
2) 如果 * elem1 和* elem2 哪个排在前面都行,那么函数返回0
3) 如果 * elem1 应该排在 * elem2 后面,则函数返回值是正整数(任何正整数都行)。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std ;
const int MAX_NUM = 1000;
int a[MAX_NUM] ;
int MyCompare(const void *e1,const void *e2)
{
return*((int*)e1) - *((int*)e2);
}
int main()
{
int total = 0 ;
ifstream srcFile("in.txt", ios::in);
if(!srcFile)
{
cout << "error opening source file ." << endl;
return 0 ;
}
ofstream destFile("out.txt",ios::out);
if(!destFile)
{
srcFile.close();
cout << "error opening destination file . " << endl;
return 0;
}
int x;
while(srcFile >> x)
{
a[total++] = x ;
}
qsort(a,total,sizeof(int),MyCompare);
for(int i = 0 ; i < total;++i)
destFile << a[i] << " ";
destFile.close();
srcFile.close();
return 0 ;
}