當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
JS-排序详解:冒泡排序、选择排序和快速排序
生活随笔
收集整理的這篇文章主要介紹了
JS-排序详解:冒泡排序、选择排序和快速排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JS-排序詳解-冒泡排序
說(shuō)明
- 時(shí)間復(fù)雜度指的是一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間
- 空間復(fù)雜度指運(yùn)行完一個(gè)程序所需內(nèi)存的大小
- 穩(wěn)定指,如果a=b,a在b的前面,排序后a仍然在b的前面
- 不穩(wěn)定指,如果a=b,a在b的前面,排序后可能會(huì)交換位置
JS冒泡排序
原理
依次比較相鄰的兩個(gè)值,如果后面的比前面的小,則將小的元素排到前面。依照這個(gè)規(guī)則進(jìn)行多次并且遞減的迭代,直到順序正確。
時(shí)間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性
- 平均時(shí)間復(fù)雜度O(n*n)
- 最好情況O(n)
- 最差情況O(n*n)
- 空間復(fù)雜度O(1)
- 穩(wěn)定性:穩(wěn)定
冒泡排序的寫法
var examplearr=[8,94,15,88,55,76,21,39]; function sortarr(arr){for(i=0;i<arr.length-1;i++){for(j=0;j<arr.length-1-i;j++){if(arr[j]>arr[j+1]){var temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}return arr; } sortarr(examplearr); console.log(examplearr);解析
兩個(gè)循環(huán)
當(dāng)i=0的時(shí)候,里面的循環(huán)完整執(zhí)行,從j=0執(zhí)行到j(luò)=6,這也就是第一遍排序,結(jié)果是將最大的數(shù)排到了最后,這一遍循環(huán)結(jié)束后的結(jié)果應(yīng)該是[8,15,88,55,76,21,39,94]
當(dāng)i=1的時(shí)候,里面的循環(huán)再次完整執(zhí)行,由于最大的數(shù)已經(jīng)在最后了,沒(méi)有必要去比較數(shù)組的最后兩項(xiàng),這也是j<arr.length-1-i的巧妙之處,結(jié)果是[8,15,55,76,21,39,88,94]
說(shuō)到這里,規(guī)律就清楚了,每次將剩下數(shù)組里面最大的一個(gè)數(shù)排到最后面,當(dāng)?shù)谝粋€(gè)循環(huán)執(zhí)行到最后的時(shí)候,也就是i=6,此時(shí),j=0,只需要比較數(shù)組的第一和第二項(xiàng),比較完畢,返回。
?
?
JS-排序詳解-選擇排序
說(shuō)明
- 時(shí)間復(fù)雜度指的是一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間
- 空間復(fù)雜度指運(yùn)行完一個(gè)程序所需內(nèi)存的大小
- 穩(wěn)定指,如果a=b,a在b的前面,排序后a仍然在b的前面
- 不穩(wěn)定指,如果a=b,a在b的前面,排序后可能會(huì)交換位置
JS選擇排序
原理
選擇排序的寫法 var example=[8,94,15,88,55,76,21,39];
function selectSort(arr){var len=arr.length;var minIndex,temp;console.time('選擇排序耗時(shí)');for(i=0;i<len-1;i++){minIndex=i;for(j=i+1;j<len;j++){if(arr[j]<arr[minIndex]){minIndex=j;}}temp=arr[i];arr[i]=arr[minIndex];arr[minIndex]=temp;}console.timeEnd('選擇排序耗時(shí)');return arr;
}
console.log(selectSort(example)); 解析
minIndex始終保存著最小值的位置的索引,隨著i的自增,遍歷的數(shù)組長(zhǎng)度越來(lái)越短,直到完成排序。
JS-排序詳解-快速排序
說(shuō)明
- 時(shí)間復(fù)雜度指的是一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間
- 空間復(fù)雜度指運(yùn)行完一個(gè)程序所需內(nèi)存的大小
- 穩(wěn)定指,如果a=b,a在b的前面,排序后a仍然在b的前面
- 不穩(wěn)定指,如果a=b,a在b的前面,排序后可能會(huì)交換位置
JS快速排序
原理
從數(shù)組中選定一個(gè)基數(shù),然后把數(shù)組中的每一項(xiàng)與此基數(shù)做比較,小的放入一個(gè)新數(shù)組,大的放入另外一個(gè)新數(shù)組。然后再采用這樣的方法操作新數(shù)組。直到所有子集只剩下一個(gè)元素,排序完成。
時(shí)間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性
- 平均時(shí)間復(fù)雜度O(nlogn)
- 最好情況O(nlogn)
- 最差情況O(n*n)
- 空間復(fù)雜度O(logn)
- 穩(wěn)定性:不穩(wěn)定
快速排序的寫法
var examplearr=[8,94,15,88,55,76,21,39]; function fastsort(arr){if(arr.length<2){return arr;}var left=[];var right=[];var pivotIndex=Math.floor(arr.length/2);var pivot=arr.splice(pivotIndex,1)[0];for(i=0;i<arr.length;i++){if(arr[i]<pivot){left.push(arr[i]);}else{right.push(arr[i])}}return fastsort(left).concat([pivot],fastsort(right)); } console.log(fastsort(examplearr));解析
pivotIndex是將數(shù)組的長(zhǎng)度除2向下取整得到的一個(gè)數(shù)值,數(shù)組的長(zhǎng)度是不斷減半的,所以最后它的值為0
pivot是利用splice方法從數(shù)組里獲取一個(gè)基數(shù)
轉(zhuǎn)載于:https://www.cnblogs.com/wu-chao/p/8522598.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JS-排序详解:冒泡排序、选择排序和快速排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2017 [六省联考] T5 分手是祝愿
- 下一篇: AngularJS——第3章 指令