快排和二分查找

来源:互联网 发布:单片机电机驱动 编辑:程序博客网 时间:2024/04/28 11:53

我只是课本的搬运工,做做笔记,当练打字也可以。这里我把qsort放前面讲是因为bsearch在使用之前需要对数组进行排序,排完后才能进行查找。老师说学了快排之后就不要用冒泡排序法和选择排序法了,然而我选择排序还不太会,找个时间整理整理吧。

 

快速排序

qsort函数:

头文件:<cstdlib> <search.h>

功能:对具有num个元素,每个元素占width字节的数组base按升序进行快速排序,并用排序后的数组覆盖该数组。compare函数介绍见二分查找

函数原型:

void qsort(void * base,size_t num , size_t width , int(cdecl*compare)(const void*elem1 , const elem2));

Qsort 使用实例:

#include<iostream>

#include<cstdlib>

#include<string>

using namespace std;

int compare(const void*a, const void*b)

{

return strcmp((char*)a, (char*)b);

}

int main()

{

char list[5][4] = { "cap", "car", "cab", "can", "cat" };

qsort((void*)list, 5, sizeof(list[0]), compare);

cout << "排序后的数组:" << endl;

for (int i = 0; i < 5; i++)

cout << list[i] << '\t';

cout << endl;

}

 

二分查找

bsearch函数:

头文件:<cstdlib> <search.h>

功能:对具有num个元素,每个元素的宽度为width字节的已排序的数组进行二分查找。

函数原型:

Void * bsearch (const void * key , const * base , size_t num , size_t width , int (cdecl * compare)(const void * elem1 , const void * elem2));

分析:

key为查找关键字,base为指向查找对象的指针(地址),num为查找对象的元素个数,

Width为元素所占的字节数,elem1为查找的关键字的指针,elem2为与关键字比较的数组元素的指针,compare为比较两个元素elem1elem2的函数。

在查找中调用compare函数一次或多次,每次都自动传送两个数组元素的指针。Compare函数比较这两个元素的大小(之所以能比较,是因为用了strcmp()函数),返回如下值之一:

( 补充说明:

strcmp()    比较两字符串的大小

<0 elem1小于elem2

=0 elem1等于elem2

>0 elem1大于elem2

函数返回查找指针。如果查找成功,查找指针指向key,如果查找失败,查找指针为NULL。如果查找对象(数组)未排序或包含相同的关键字,其执行结果不可预料。

Bsearch使用实例:

#include<iostream>

#include<cstdlib>

#include<string> //为strcmp()函数提供原型

using namespace std;

int compare(const void *a,const void *b)

{

return strcmp((char*)a, (char*)b);

}

int main()

{

char list[5][4] = { "cab", "can", "cap", "car", "cat" };

if (bsearch("cab", (void*)list, 5, sizeof(list[0]), compare) != NULL)

cout << "该关键字在数组中存在!" << endl;

}

0 0
原创粉丝点击