2022年2022年各种排序算法 .pdf
《2022年2022年各种排序算法 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年各种排序算法 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1. 冒泡排序 ,最简单也最常用的一种(_不复习的情况下, 笔试遇到排序问题, 我只能记住它 ),思想是:每次将数组前N 个中最大(升序)或最小(降序)的数交换到数组底部,每次数组大小N- ,再进行如此操作,直到所有的数都已排序即N=1 。这样循环比较的次数是(n-1 )+(n-2)+(n-3). 约等于(n)(n+1)/2, 时间复杂度为O(n2),N的平方。 C 语言实现如下:void bubble_sort( int*array , int size )int i , j , temp ;for( i =size -1; i 1; i -)for( j =0; j array j +1)
2、 temp = array j +1; array j +1 = array j ; array j = temp;2. 交换排序 ,原理是用第一个元素和第二个元素比较,若第一个元素大于第二个,则交换,交换后第一个元素在与第三个元素比较. 直到 N 个元素,然后再选择第二个元素和第三个元素比较,进行同样操作 .直到选择到 N 个元素。这样操作完成后数组就变为升序了。其实说白了,原理就是第一次交换,确保第一个元素是最小的,第二次交换确保第二个元素是第二小的. 以此类推。效率也很低,循环次数(n-1)(n-2).即 O(n2), n的平方, C 语言实现如下:void change_sort (
3、int*array , int size )int i , j , temp ;for( i =0; i size ; i +)for( j =i +1; j array j ) temp = array j ; array j = array i ; array i = temp ;3. 选择排序 ,仔细看交换排序,发现其实没必要每次发现比自己小的元素就发生交换,只要和剩下的元素中最小的那个元素交换就可以了,即选择最小的元素进行交换,那么交换排序的扩展算法,选择排序就很容易得出来了,效率略比交换排序高,整体平均效率还是N 的平方, C 语言实现如下:void select_sort( int
4、*array , int size )int i , j , temp, pos ;for( i =0; i size ; i +) for(j =i +1, temp =array i , pos =i ; j array j ) temp = array j ; pos = j ; array pos = array i ; array i = temp ;4. 插入排序 ,有点类似冒泡排序的逆操作,也是比较简单易懂的算法。原理是,现对数组第一个和第二个排序,这样前 2 个元素就是有序的了,再引入第三个元素,找到合适的位置插入。以此插入剩余元素。这种排序算法比起冒泡排序算法效率更高,有点类
5、似冒泡排序的改进算法。虽然效率上比冒泡排序好,但名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 是也是一种简单排序算法,循环次数为1+2+3.+n-1,即 n(n+1)/2, 平均情况下时间复杂度还是O(n2),n的平方。 C 语言实现如下:void insert_sort( int*array , int size )int i , j , temp ;for( i =1; i 0& temp0; gap=(gap = 2
6、?1:( int )( gap/ 2. 2) )for( i =gap; i =gap & temp array j - gap; j =j -gap) array j = array j - gap; array j = temp;6. 归并排序 ,采用的是分治算法,即将一组元素通过几次平分,分成若干组元素 (最终单个元素为一组),这样就形成一个满二叉树形结构,叶子节点为单个元素,归属于同一父节点的两组元素排序后归并成一组元素,最终归属于根节点的两组元素再归并成一组元素,完成排序。这是典型的分治算法,如能理解分治算法的含义,那么也不难理解归并排序。这个算法的缺点是需要借助于排序元素相同大小的
7、辅助数组,而且需要将数据反复的在原始数组和辅助数组之间拷贝,这些额外的工作大大降低了此算法的工作效率,时间复杂度为 O(NlogN),C编码如下:voidmerge( int*array , int*temp_array , intleft ,intright , intright_end )int left_end = right- 1 , i ;int tmp = left;int num = right_end - left+1;while( left= left_end & right= right_end)if(array left = array right ) temp_arra
8、y tmp+ = array left +;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - else temp_array tmp+ = array right +;while(left= left_end) temp_array tmp+ = array left+;while( right= right_end) temp_array tmp+ = array right +;for( i =0; i num ; i +,
9、 right_end-) array right_end = temp_array right_end ;void m_sort ( int*array ,int*temp_array ,intleft, intright )int center ;if( left right ) center = ( left +right )/ 2; m_sort( array , temp_array , left, center ); m_sort( array , temp_array , center +1,right );merge(array , temp_array ,left , cent
10、er +1, right );void merge_sort (int*array , int size )int*temp = ( int *) malloc ( size );memset ( temp, 0 , size ); m_sort( array , temp, 0 , size - 1);free ( temp);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 7. 快速排序 .实际应用中用的最多的,也是最常见
11、的一种排序方法,其主要思想还是用了分治法,算法是,从数组中找到一个支点,通过交换,使得支点的左边都是小于支点的元素,支点的右边都是大于支点的元素,而支点本身所处的位置就是排序后的位置!然后把支点左边和支点右边的元素看成两个子数组,再进行如上支点操作直到所有元素有序!这是基本的算法思想,各种不同的实现可能和支点的选择有关,最简单的是选择第一个元素做支点,常用的是选择中间的元素做支点,而本文的实现代码是第一个元素,中间元素,最后一个元素,这三个元素的中值即满足(abc)时,取 b 作为支点,这样能比纯粹的选第一个元素和中间元素更加合理。实现代码如下:voidswap( int* a, int*b)
12、 /交换函数int temp = *a;*a = *b;*b = temp;intpartition( int* array , int low , int high )int middle = ( low+high )/ 2, temp , pivot, i , j ;/ 选择第一个元素,最后一个元素,中间元素中的中间值作为支点if( array middle array low)swap(&array middle ,&array low);if( array high array low)swap (&array high ,&array low);if( array high arra
13、y middle )swap (&array high ,&array middle ); pivot = array middle ;/ 选中支点名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - swap (&array middle ,&array high -1); / 将支点值换到倒数第二个位置for(i =low, j =high -1; ;)while( array + i pivot ) /找到一个大于支点的元素w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年各种排序算法 2022 各种 排序 算法
限制150内