欢迎来到天天文库
浏览记录
ID:21938072
大小:50.67 KB
页数:14页
时间:2018-10-25
《排序算法[c#实现]》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、各种排序算法总结和比较 排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序、希尔排序、二叉树排序、计数排序、桶排序、基数排序。 代码都经过了CodeBlocks的调试,但是很可能有没注意到的BUG,欢迎指出。 比较排序和非比较排序 常见的排序算法都是比较排序,非比较排序包括计数排序、桶排序和基数排序,非比较排序对数据有要求,
2、因为数据本身包含了定位特征,所有才能不通过比较来确定元素的位置。 比较排序的时间复杂度通常为O(n2)或者O(nlogn),比较排序的时间复杂度下界就是O(nlogn),而非比较排序的时间复杂度可以达到O(n),但是都需要额外的空间开销。 比较排序时间复杂度为O(nlogn)的证明: a1,a2,a3……an序列的所有排序有n!种,所以满足要求的排序a1',a2',a3'……an'(其中a1'<=a2'<=a3'……<=an')的概率为1/n!。基于输入元素的比较排序,每一次比较的返回不是0就是1,这恰好可以作为决策树的一个决策将一个
3、事件分成两个分支。比如冒泡排序时通过比较a1和a2两个数的大小可以把序列分成a1,a2……an与a2,a1……an(气泡a2上升一个身位)两种不同的结果,因此比较排序也可以构造决策树。根节点代表原始序列a1,a2,a3……an,所有叶子节点都是这个序列的重排(共有n!个,其中有一个就是我们排序的结果a1',a2',a3'……an')。如果每次比较的结果都是等概率的话(恰好划分为概率空间相等的两个事件),那么二叉树就是高度平衡的,深度至少是log(n!)。 又因为1.n!4、=O(nlogn). 2. n!=n(n-1)(n-2)(n-3)…1 >(n/2)^(n/2)两边取对数得到log(n!)>(n/2)log(n/2)= Ω(nlogn),所以log(n!)= Ω(nlogn)。 因此log(n!)的增长速度与nlogn相同,即log(n!)=Θ(nlogn),这就是通用排序算法的最低时间复杂度O(nlogn)的依据。 排序的稳定性和复杂度 不稳定: 选择排序(selectionsort)—O(n2) 快速排序(quicksort)—O(nlogn)平均时间,O(n2)最坏情5、况;对于大的、乱序串列一般认为是最快的已知排序 堆排序 (heapsort)—O(nlogn) 希尔排序 (shellsort)—O(nlogn) 基数排序(radixsort)—O(n·k);需要O(n)额外存储空间(K为特征个数) 稳定: 插入排序(insertionsort)—O(n2) 冒泡排序(bubblesort)—O(n2) 归并排序 (mergesort)—O(nlogn);需要O(n)额外存储空间 二叉树排序(Binarytreesort)—O(nlogn);需要O(n)额外存储空间 计数排序6、 (countingsort)—O(n+k);需要O(n+k)额外存储空间,k为序列中Max-Min+1 桶排序 (bucketsort)—O(n);需要O(k)额外存储空间 每种排序的原理和实现 插入排序 遍历数组,遍历到i时,a0,a1...ai-1是已经排好序的,取出ai,从ai-1开始向前和每个比较大小,如果小于,则将此位置元素向后移动,继续先前比较,如果不小于,则放到正在比较的元素之后。可见相等元素比较是,原来靠后的还是拍在后边,所以插入排序是稳定的。 当待排序的数据基本有序时,插入排序的效率比较高,只需要进行很少的数7、据移动。voidinsertion_sort(inta[],intn){inti,j,v;for(i=1;i=0&&v8、],intn){inti,j,pos,tmp;for(i=0;i
4、=O(nlogn). 2. n!=n(n-1)(n-2)(n-3)…1 >(n/2)^(n/2)两边取对数得到log(n!)>(n/2)log(n/2)= Ω(nlogn),所以log(n!)= Ω(nlogn)。 因此log(n!)的增长速度与nlogn相同,即log(n!)=Θ(nlogn),这就是通用排序算法的最低时间复杂度O(nlogn)的依据。 排序的稳定性和复杂度 不稳定: 选择排序(selectionsort)—O(n2) 快速排序(quicksort)—O(nlogn)平均时间,O(n2)最坏情
5、况;对于大的、乱序串列一般认为是最快的已知排序 堆排序 (heapsort)—O(nlogn) 希尔排序 (shellsort)—O(nlogn) 基数排序(radixsort)—O(n·k);需要O(n)额外存储空间(K为特征个数) 稳定: 插入排序(insertionsort)—O(n2) 冒泡排序(bubblesort)—O(n2) 归并排序 (mergesort)—O(nlogn);需要O(n)额外存储空间 二叉树排序(Binarytreesort)—O(nlogn);需要O(n)额外存储空间 计数排序
6、 (countingsort)—O(n+k);需要O(n+k)额外存储空间,k为序列中Max-Min+1 桶排序 (bucketsort)—O(n);需要O(k)额外存储空间 每种排序的原理和实现 插入排序 遍历数组,遍历到i时,a0,a1...ai-1是已经排好序的,取出ai,从ai-1开始向前和每个比较大小,如果小于,则将此位置元素向后移动,继续先前比较,如果不小于,则放到正在比较的元素之后。可见相等元素比较是,原来靠后的还是拍在后边,所以插入排序是稳定的。 当待排序的数据基本有序时,插入排序的效率比较高,只需要进行很少的数
7、据移动。voidinsertion_sort(inta[],intn){inti,j,v;for(i=1;i=0&&v8、],intn){inti,j,pos,tmp;for(i=0;i
8、],intn){inti,j,pos,tmp;for(i=0;i
此文档下载收益归作者所有