經(jīng)典排序算法 冒泡排序 原理:
1.比較相鄰的元素,如果第一個(gè)比第二個(gè)大,就交換位置。
2.重復(fù)以上步驟,依次得出最大值,次大值。。。。
3.重復(fù)以上步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較
算法分析:
1.若文件的初始狀態(tài)是正序,一趟掃描完成排序。所需要的關(guān)鍵字的比較次數(shù)C和記錄移動(dòng)的次數(shù)M達(dá)到最小值:Cmin=n-1,Mmin=0,故冒泡排序的時(shí)間復(fù)雜度O(n);
2.若初始文件是反序的,需要進(jìn)行n-1趟排序。每趟排序要進(jìn)行n-i(1<=i<=n-1)次關(guān)鍵字的比較,且每次比較都必須移動(dòng)記錄3次(比如交換a[i-1]和a[i];tmp=a[i-1];a[i-1]=a[i];a[i]=tmp)來達(dá)到交換記錄的位置。此時(shí),比較和移動(dòng)次數(shù)都達(dá)到最大值:Cmax=n*(n-1)/2=O(n2);Mmax=3n*(n-1)/2=O(n2), (根據(jù)等差數(shù)列求得) 故冒泡排序的最壞的時(shí)間復(fù)雜度是O(n2)。
綜上兩點(diǎn),冒泡排序總的平均時(shí)間復(fù)雜度為O(n2);
總結(jié):平均時(shí)間復(fù)雜度:O(n2), 穩(wěn)定度:穩(wěn)定, 空間復(fù)雜度:O(1)
代碼實(shí)現(xiàn):vararr=[1,5,3,2];functionbubbleSort(arr){for(leti=0,l=arr.length;i
1.從待排序中,找到最小的元素
2.如果最小元素不在排序序列的第一個(gè)元素,和第一個(gè)元素進(jìn)行交換
3.從剩下的n-1個(gè)元素中,找出最小的元素,重復(fù)1,2步驟
算法分析:
1.時(shí)間復(fù)雜度:O(n2)
2.空間復(fù)雜度:O(1)
1.將第二個(gè)位置的數(shù)字,和左面的數(shù)字比較,放入合適的位置(相當(dāng)于手中有牌,又抓了一張牌)
2.將i個(gè)位置的數(shù)字,和其所在位置的左面的數(shù)字依次比較,放入合適的位置
3.重復(fù)以上步驟,直到排序完成。
算法分析:
1.時(shí)間復(fù)雜度:O(n2)
2.空間復(fù)雜度:O(1)
?
算法分析:
1.算法穩(wěn)定性:穩(wěn)定
2.時(shí)間復(fù)雜度:O(n*log2n),歸并排序的形式就是一棵二叉樹,它需要遍歷的次數(shù)就是二叉樹的深度,而根據(jù)完全二叉樹可以得出
3.空間復(fù)雜度:n
補(bǔ)充:瀏覽器棧的大小限制,可以用如下的代碼
?
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([]);// 如果數(shù)組長(zhǎng)度為奇數(shù)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] = [];// 如果數(shù)組長(zhǎng)度為奇數(shù)}returnwork[0]; } 快速排序(quick sort) 原理:是冒泡排序基礎(chǔ)上的遞歸分治法1.比較全面你的一個(gè)解釋網(wǎng)址,我喜歡
算法分析:
1.最壞時(shí)間復(fù)雜度O(n2)
2.平均時(shí)間復(fù)雜度:O(nlogn)
評(píng)論
查看更多