关于查找(二分查找)和排序(冒泡和快速)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 关于查找(二分查找)和排序(冒泡和快速),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言:查找和排序是属于数据结构里面的内容,目前数据结构我才开始学习,所以现在先总结一下目前我已知的二分查找和冒泡排序、快速排序算法。

目录

查找:二分查找

1.解析:

2.注意:

3.具体代码实现:

4.代码解析:

排序:冒泡排序和快速排序

冒泡排序

1.解析:

2.下面看具体代码:

快速排序:

1.解析:

2.下面看具体代码:

3.注意:


查找:二分查找

1.解析:

    目前我的理解,二分查找是运用在一组有序的数据当中,且时间复杂度为O(log2^{n});为什么是log2^{n}?【对于时间复杂度还不明白的可以看我的博客(一道经典的C语言面试题)】;因为它每次都能排除一半的数据!!!最终就是n   n/2   n/4 ….. 1是一个以2为底等比数列,最终就是 O(log2^{n})

2.注意:

在我们动手写之前,我们要想明白要创建的变量:

1.创建一个数组(暂定为arr)用来存取数据

2.创建一个计算数组大小的变量(暂定sz)

3.创建一个变量代表要查找的数(暂定k)

4.创建一个可以代表中间数据下标的数据(暂定为mid);既然要求中间数据的下标,肯定要知道最左边(暂定为left)和最右边(暂定为right)的下标;因为mid = (left+right) / 2 啊!!!

当我们理清楚要创建的变量,代码的思路肯定就已经在我们心里了,下面看具体代码是实现

3.具体代码实现:

关于查找(二分查找)和排序(冒泡和快速)

4.代码解析:

    让我们来详细解析一下这段代码:

    1.我是封装成函数的形式,那么我们要想一下,我们要传什么实参呢?首先数组(arr)肯定要传过去的;大小(sz),要传吗?等数组传过去过后,在函数里求sz可以吗?答案是否定的,我们传过去的数组实际上是首元素的的地址,如果用传过去的数组,在封装的函数里在计算sz的大小,结果并不是我们想要的结果;所以我们要记住一点:对于数组要想知道数组的大小,必须现在主函数里计算好,在传参传给函数里,不能在函数里直接求;还有就是要c传过去要查找的数k

    2.对于循环条件,肯定是left<right;左边数据的下标肯定不能超过右边数据的下标;但是对于while(left<right)这个判断条件,很多人都不太明白要不要带等号呢?如果你分不清,可以试试下面这种方式:

 ====》如果left = 0 , right = sz======>right实际上是只能取到sz-1;所以写成while(left<right)

 ====》如果left = 0 , right = sz-1======>right实际上是就能取到sz-1;所以写成while(left<=right)

3. 如果arr[mid]>k;说明数据要查找的数据在mid的左边,就把right=mid-1;重新再求mid

    如果arr[mid]<k;说明数据要查找的数据在mid的右边,就把left=mid+1;重新再求mid

   就这样一直循环下去,最终找到要查找的数据,break跳出循环,返回它的下标

排序:冒泡排序和快速排序

冒泡排序

1.解析:

     对于冒泡排序我们要弄清楚一个事,要排几趟?每趟要交换几个元素?===》升序排

    1. 对于n个元素,我们最多要排几趟才可以使它有序呢?当然是n-1趟就可以了!!!
    2. 那么每趟交换几个元素呢?比如有6个元素吧,第一趟交换5个,既可以确定一个元素,那么第二趟只需交换4个就可以确定第二个元素……我们不难发现规律,交换的次数,是随着要排的趟数增加而递减的;很容易想明白吧,随着趟数的增加,确定的元素越多,最终交换的次数就会变少;假如排的趟数是i;那么每趟要交换的次数就是n-1-i

   3. 我们就按照升序排,用i来控制趟数=========》n-1趟 

                                       用j来控制交换次数======》n-1-i交换次数

遇到前面的值比后面大,就进行交换

2.下面看具体代码:

关于查找(二分查找)和排序(冒泡和快速)

     我们封装一个函数来写,当然你也可以不封装成函数来写,函数传参怎么办呢?传那些变量,首先数组arr肯定要传过去的,然后就是数组的大小sz要传过去,就可以了。冒泡排序可能是最好理解的排序方法。但是冒泡排序有一个弊端,只能传整型数据。

快速排序:

1.解析:

    对于快速排序我们可以用库函数qsort,可以用MSDN来查看一下qsort函数的参数:

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

我来解释一下:qsort函数可以传各种的数据类型,总共需要四个参数:

qsort(数组名, 数组大小 , 宽度 ,函数)===》比如:对于一个整型数组arr[10],有10个元素,一个整型占4个字节,宽度就是4 ====》qsort(arr ,10 , 4,qsort_bubble )其中qsort_bubble函数是我们自己定义的,它的使用包括返回类型是根据我们的需要设置的;比如:

关于查找(二分查找)和排序(冒泡和快速)

    因为是整型数据,所以返回类型是int ;e1和e2加上const修饰,表示不能改变,毕竟我们只是排序,并不改变它的值;因为不知道接收过来的是什么类型的参数,所以类型定义为void,使用时根据类型自己强制类型转化。

2.下面看具体代码:

关于查找(二分查找)和排序(冒泡和快速)

3.注意:

我们需要注意两点:

1. 如果是e1-e2那么就是升序,如果e2-e1就是降序啦;它是根据返回的值是>0 =0 <0来判断大小的。

2. 对于整型数据,我们可以直接强制类型转换后,相减看与0的关系;

那么对于字符型呢?就需要strcmp函数来比较字符串啦,同样也是根据返回值>0 =0 <0来排序。

qsort函数的调用需要引头文件<stdlib.h>

4.总结:

    以上就是我所知道的查找和排序算法;等我学完数据结构,再来补一期完整版的查找和排序,一起加油吧!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128550.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!