qsort函数

来源:互联网 发布:最权威的大数据书籍 编辑:程序博客网 时间:2024/06/06 10:59

 

 

个人感觉qsort是个比较强大的排序函数,可以排int,char,double,等等,几乎都可以排序,

1. int型排序

再c++中,int是最简单的所以它的排序也是最简单的,

程序代码:#include <iostream>
using namespace std ;

int compare(const void *, const void *);

int main()
{
int array[10]={5,3,5,7,4,8,9,19,30,34};

cout << "The original array is:/n";

for (int i=0;i<10;i++)
   cout << array[i] << " ";

cout << endl;

qsort(array,10,sizeof(array[0]),compare);

cout << "After sort, now the array is:/n";

for (int i=0;i<10;i++)
   cout << array[i] << " ";

cout << endl;
    system("pause");

return 0;
}

int compare(const void *num1, const void *num2)
{
return *(int *)num1 - *(int *)num2;
}

 

2.char型

 

程序代码:

 

#include <iostream>
using namespace std ;

int compare(const void *, const void *);

int main()
{
char string[10]="jsnanjing";

cout << "The original string is:/n";

for (int i=0;i<10;i++)
   cout << string[i] << " ";

cout << endl;

qsort(string,10,sizeof(string[0]),compare);

cout << "After sort, now the string is:/n";

for (int i=0;i<10;i++)
   cout << string[i] << " ";

cout << endl;
    system("pause");

return 0;
}

int compare(const void *num1, const void *num2)
{
return *(char *)num1 - *(char *)num2;
}

 

3.double型

程序代码:

#include <iostream>
using namespace std ;

int compare(const void *, const void *);

int main()
{
double array[10]={2.2,1.3,4.3,5.6,6.6,4.5,9.6,5.5,4.6};

cout << "The original array is:/n";

for (int i=0;i<10;i++)
   cout << array[i] << " ";

cout << endl;

qsort(array,10,sizeof(array[0]),compare);

cout << "After sort, now the array is:/n";

for (int i=0;i<10;i++)
   cout << array[i] << " ";

cout << endl;
    system("pause");

return 0;
}

int compare(const void *num1, const void *num2)
{
return (*(double *)num1 - *(double *)num2)>0?1:-1;
}//因为当两个double型的数整数部分相等时,compare函数会返回0,表示这两个数相等,所以我们要这样写来避免这个问题

 

4.对字符串进行排序

程序代码:

#include <iostream>
#include <cmath>
using namespace std ;

int compare(const void *, const void *);

int main()
{
char string[3][10]={"southeast","jsnanjing","jiangning"};

cout << "The original string is:/n";

for (int i=0;i<3;i++)
   cout << string[i] << " ";

cout << endl;

qsort(string,3,sizeof(string[0]),compare);

cout << "After sort, now the string is:/n";

for (int i=0;i<3;i++)
   cout << string[i] << " ";

cout << endl;
    system("pause");

return 0;
}

int compare(const void *num1, const void *num2)
{
return strcmp((char *)num1 ,(char *)num2);
}//此时的compare中有较大的变化,应当注意,因为strcmp函数的参数就是指针,所以只要转化为char型指针就可以了

 

5.对结构体的排序,

#include <iostream>
#include <cmath>
using namespace std ;

int compare(const void *, const void *);

struct Student
{
int StudentID;
int Grade;
};

int main()
{
Student student[3]={15,87,16,95,20,87};

cout << "The original student is:/n";

for (int i=0;i<3;i++)
   cout << student[i].StudentID << " " << student[i].Grade << endl;

cout << endl;

qsort(student,3,sizeof(student[0]),compare);

cout << "After sort, now the student is:/n";

for (int i=0;i<3;i++)
   cout << student[i].StudentID << " " << student[i].Grade << endl;

cout << endl;
    system("pause");

return 0;
}

int compare(const void *num1, const void *num2)
{
Student *stu1=(Student *)num1;
Student *stu2=(Student *)num2;

if(stu1->Grade != stu2->Grade)
   return stu1->Grade - stu2->Grade;
else
   return stu1->StudentID - stu2->StudentID;

}

 

 

显然我们要注意double型的,和字符串的排序时compare函数的写法,double型要注意相等的判断,字符串就是要注意字符大小比较函数strcmp的用发即可。