经典排序算法 冒泡排序 原理:
1.比较相邻的元素,如果第一个比第二个大,就交换位置。
2.重复以上步骤,依次得出最大值,次大值。。。。
3.重复以上步骤,直到没有任何一对数字需要比较
1.若文件的初始状态是正序,一趟扫描完成排序。所需要的关键字的比较次数C和记录移动的次数M达到最小值:Cmin=n-1,Mmin=0,故冒泡排序的时间复杂度O(n);
2.若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i(1<=i<=n-1)次关键字的比较,且每次比较都必须移动记录3次(比如交换a[i-1]和a[i];tmp=a[i-1];a[i-1]=a[i];a[i]=tmp)来达到交换记录的位置。此时,比较和移动次数都达到最大值:Cmax=n*(n-1)/2=O(n2);Mmax=3n*(n-1)/2=O(n2), (根据等差数列求得) 故冒泡排序的最坏的时间复杂度是O(n2)。
综上两点,冒泡排序总的平均时间复杂度为O(n2);
总结:平均时间复杂度:O(n2), 稳定度:稳定, 空间复杂度:O(1)
代码实现:vararr=[1,5,3,2];functionbubbleSort(arr){for(leti=0,l=arr.length;i
1.从待排序中,找到最小的元素
2.如果最小元素不在排序序列的第一个元素,和第一个元素进行交换
3.从剩下的n-1个元素中,找出最小的元素,重复1,2步骤
1.时间复杂度:O(n2)
2.空间复杂度:O(1)
1.将第二个位置的数字,和左面的数字比较,放入合适的位置(相当于手中有牌,又抓了一张牌)
2.将i个位置的数字,和其所在位置的左面的数字依次比较,放入合适的位置
3.重复以上步骤,直到排序完成。
1.时间复杂度:O(n2)
2.空间复杂度:O(1)
1.算法稳定性:稳定
2.时间复杂度:O(n*log2n),归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树可以得出
3.空间复杂度:n
varcnt =0;try{ (function(){cnt++;arguments.callee(); })(); }catch(e) { console.log(e.message, cnt); }
为了防止遇到栈溢出的代码,将递归改为了迭代:
functionmerge(left, right){varresult = [];while(left.length && right.length) {if(left[0] < right[0]) result.push(left.shift());elseresult.push(right.shift()); }returnresult.concat(left, right); }functionmergeSort(a){if(a.length ===1)returna;varwork = [];for(vari =0, len = a.length; i < len; i++) work.push([a[i]]); work.push([]);// 如果数组长度为奇数for(varlim = len; lim >1; lim = ~~((lim +1) /2)) {for(varj =0, k =0; k < lim; j++, k +=2) work[j] = merge(work[k], work[k +1]); work[j] = [];// 如果数组长度为奇数}returnwork[0]; } 快速排序(quick sort) 原理:是冒泡排序基础上的递归分治法1.比较全面你的一个解释网址,我喜欢
1.最坏时间复杂度O(n2)
2.平均时间复杂度:O(nlogn)
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』