面试排序算法总结.doc

排序算法 1、?插入排序 以下面5个无序的数据为例: 65 27 59 64 58 (文中仅细化了第四次插入过程) 第1次插入: 27 65 59 64 58 第2次插入: 27 59 65 64 58 第3次插入: 27 59 64 65 58 第4次插入: 27 58 59 64 65 二. 、效率分析 稳定? 空间复杂度O(1)? 时间复杂度O(n2)? 最差情况:反序,需要移动n*(n-1)/2个元素? 最好情况:正序,不需要移动元素 数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n); 插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。 通常,插入排序呈现出二次排序算法中的最佳性能。 对于具有较少元素(如n=15)的列表来说,二次算法十分有效。 在列表已被排序时,插入排序是线性算法O(n)。 在列表“近似排序”时,插入排序仍然是线性算法。 在列表的许多元素已位于正确的位置上时,就会出现“近似排序”的条件。 通过使用O(nlog2n)效率的算法(如快速排序)对数组进行部分排序, 然后再进行选择排序,某些高级的排序算法就是这样实现的。 三. 算法实现 从前向后查找的插入排序: [cpp]?view plain?copy /********************************************************? *函数名称:InsertSort? *参数说明:pDataArray?无序数组;? *??????????iDataNum为无序数据个数? *说明:????插入排序? *********************************************************/?? void?InsertSort(int*?pDataArray,?int?iDataNum)?? {?? ????for?(int?i?=?1;?i??iDataNum;?i++)????//从第2个数据开始插入?? ????{?? ????????int?j?=?0;?? ????????while?(j??i??pDataArray[j]?=?pDataArray[i])????//寻找插入的位置?? ????????????j++;?? ?????????? ????????if?(j??i)????//i位置之前,有比pDataArray[i]大的数,则进行挪动和插入?? ????????{?? ????????????int?k?=?i;?? ????????????int?temp?=?pDataArray[i];?? ????????????while?(k??j)????//挪动位置?? ????????????{?? ????????????????pDataArray[k]?=?pDataArray[k-1];?? ????????????????k--;?? ????????????}?? ????????????pDataArray[k]?=?temp;????//插入?? ????????}?? ????}?? }?? 但楼主发现从后面查找插入的方式,代码复杂程度较低: [cpp]?view plain?copy /********************************************************? *函数名称:InsertSort? *参数说明:pDataArray?无序数组;? *??????????iDataNum为无序数据个数? *说明:????插入排序? *********************************************************/?? void?InsertSort(int*?pDataArray,?int?iDataNum)?? {?? ????for?(int?i?=?1;?i??iDataNum;?i++)????//从第2个数据开始插入?? ????{?? ????????int?j?=?i?-?1;?? ????????int?temp?=?pDataArray[i];????//记录要插入的数据?? ????????while?(j?=?0??pDataArray[j]??temp)??//从后向前,找到比其小的数位置?? ????????{?? ????????????pDataArray[j+1]?=?pDataArray[j];????//向后挪动?? ????????????j--;?? ????????}?? ?? ????????if?(j?!=?i?-?1)????//存在比其小的数?? ????????????pDataArray[j

文档评论(0)

1亿VIP精品文档

相关文档