摘要:二代碼簡(jiǎn)單選擇排序一分析循環(huán)次,每一次的當(dāng)前項(xiàng)與其之后的項(xiàng)作比較,找出其中最小的那個(gè),與當(dāng)前項(xiàng)交換。二代碼希爾排序是一種改進(jìn)版的插入排序,縮小增量排序。這樣做的目的是因?yàn)?,直接插入排序在序列基本有序時(shí)效率最高。
排序算法 | 平均情況 | 最好情況 | 最壞情況 | 輔助空間 | 穩(wěn)定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 穩(wěn)定 |
簡(jiǎn)單選擇排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 穩(wěn)定 |
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 穩(wěn)定 |
希爾排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不穩(wěn)定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不穩(wěn)定 |
歸并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 穩(wěn)定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(nlogn)~O(n) | 不穩(wěn)定 |
簡(jiǎn)單算法:冒泡、簡(jiǎn)單選擇、直接插入
改進(jìn)算法:希爾、堆、歸并、快速
后三種改進(jìn)算法比希爾算法效率高,但最好的情況下,冒泡和直接插入最有效,因此如果數(shù)組基本有序,則需要考慮簡(jiǎn)單算法
1. 冒泡排序一、分析
冒泡arr.length-1趟;
第i趟,比較arr.length-i-1次,兩兩比較,反序則交換位置。
改進(jìn):為了避免已經(jīng)有序的情況下進(jìn)行無意義的兩兩比較,用flag標(biāo)志上一趟是否有交換,沒有交換則已經(jīng)是有序數(shù)組,退出循環(huán)。
二、代碼
function bubbleSort(arr){ var flag=true; for(let i=0;i2. 簡(jiǎn)單選擇排序arr[j+1]){ [arr[j],arr[j+1]]=[arr[j+1],arr[j]]; flag=true; } } } return arr; }
一、分析
循環(huán)arr.length-1次,每一次的當(dāng)前項(xiàng)與其之后的項(xiàng)作比較,找出其中最小的那個(gè),與當(dāng)前項(xiàng)交換。
二、代碼
function selectSort(arr){ var min=0; for(let i=0;i3. 直接插入排序 一、分析
從數(shù)組的第二項(xiàng)開始,循環(huán)arr.length-1次;
將當(dāng)前項(xiàng)的值賦值給臨時(shí)變量:(留出一個(gè)“坑”)為了前面大于當(dāng)前項(xiàng)的項(xiàng)能夠后移;
當(dāng)前項(xiàng)與其前面的項(xiàng)比較,如果大于當(dāng)前項(xiàng)后移,直到找到小于當(dāng)前項(xiàng)的那個(gè),將當(dāng)前項(xiàng)插入其后;
如果前面沒有小于當(dāng)前項(xiàng)的,前面項(xiàng)全部后移以為,當(dāng)前項(xiàng)就插入位置0處。
二、代碼
function insertSort(arr){ for(let i=1;i4. 希爾排序=0&&arr[j]>temp){ arr[j+1]=arr[j]; j--; } arr[j+1]=temp; } return arr; } ??是一種改進(jìn)版的插入排序,“縮小增量排序”。
一、分析通過增量將待排序列分割成若干個(gè)子序列,每個(gè)子序列進(jìn)行插入排序;
縮小增量,重復(fù)步驟1,直到增量不大于0;
ps:增量等于1時(shí),進(jìn)行了一次全排的直接插入排序。這樣做的目的是因?yàn)?,直接插入排序在序列基本有序時(shí)效率最高。
二、代碼
function shellSort(arr){ for(let increment=Math.floor(arr.length/2);increment>0;increment=Math.floor(increment/2)){ for(let i=increment;i5. 堆排序=0&&arr[j]>temp){ arr[j+increment]=arr[j]; j-=increment; } arr[j+increment]=temp; } } return arr; } 一、分析
將待排序列構(gòu)造成一個(gè)大頂堆(位置0處,也就是堆頂,為最大數(shù));
將arr[0]與arr[arr.length-1]進(jìn)行交換,此時(shí)數(shù)組尾為最大值;
調(diào)整0~arr.length-2成一個(gè)大頂堆,繼續(xù)2,直到全部排完。
二、代碼
function heapSort(arr){ //1. 構(gòu)造大頂堆 //2. 頂值最大,交換到最末尾 //3. 調(diào)整大頂堆 var len=arr.length; for(let i=Math.floor(len/2)-1;i>=0;i--){ heapAdjust(arr,i,len); } for(let i=arr.length-1;i>0;i--){ [arr[0],arr[i]]=[arr[i],arr[0]]; heapAdjust(arr,0,i); } return arr; } function heapAdjust(arr,pos,len){ var root=pos; for(let i=2*pos+1;i6. 歸并排序 一、分析
將兩個(gè)有序數(shù)組合成一個(gè)有序數(shù)組:歸并。
將一個(gè)數(shù)組分割成長(zhǎng)度為1的數(shù)組,就可以當(dāng)做它是一個(gè)有序數(shù)組,兩兩合并,就成了一個(gè)長(zhǎng)度為2的有序數(shù)組,再兩兩合并,直到排序完成。
二、代碼
function mergeSort(arr){ if(arr.length<=1){return arr}; let mid=Math.floor(arr.length/2); let left=arr.slice(0,mid); let right=arr.slice(mid); // console.log(left+"+"+right); return merge(mergeSort(left),mergeSort(right)); } function merge(left,right){ var result=[]; while(left.length>0&&right.length>0){ if(left[0]7. 快速排序 一、分析
找基準(zhǔn)
小于基準(zhǔn)的放左邊,大于基準(zhǔn)的放右邊;
遞歸基準(zhǔn)左、右無序序列找基準(zhǔn);
直到輸入數(shù)組長(zhǎng)度為1,跳出遞歸。
二、代碼
function qSort1(arr){ if(arr.length<=1){return arr;} let pivot=arr[0]; let left=[];let right=[]; for(let i=1;i=arr[low]){ low++ } [arr[low],arr[high]]=[arr[high],arr[low]]; } return low; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97412.html
摘要:算法描述冒泡排序是一種簡(jiǎn)單的排序算法。算法描述和實(shí)現(xiàn)一般來說,插入排序都采用在數(shù)組上實(shí)現(xiàn)。平均情況希爾排序年發(fā)明第一個(gè)突破的排序算法是簡(jiǎn)單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會(huì)優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個(gè)庫(kù),讀者可以Clone下來本地嘗試。此博文配合源碼體驗(yàn)更棒哦~~~ 個(gè)人博客:Damonare的個(gè)人博客 原文地址:...
摘要:代碼實(shí)現(xiàn)六堆排序算法簡(jiǎn)介堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。九計(jì)數(shù)排序算法簡(jiǎn)介計(jì)數(shù)排序是一種穩(wěn)定的排序算法。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 1、插入排序 1)算法簡(jiǎn)介 插入排序(Insertion-Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法。它...
摘要:實(shí)現(xiàn)插入排序插入排序是一種非常簡(jiǎn)單的算法,最適合大部分已經(jīng)被排好序的數(shù)據(jù)。由此才有了這個(gè)名字插入排序。插入排序的最壞情況是輸入的數(shù)組是按逆序排序的??偨Y(jié)當(dāng)輸入的數(shù)組已經(jīng)大部分被排好序時(shí),插入排序的效果最佳。 翻譯:瘋狂的技術(shù)宅https://medium.com/@jimrottin... 本文首發(fā)微信公眾號(hào):前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 插入排序的工作原理...
摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個(gè)待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...
閱讀 925·2021-10-18 13:32
閱讀 3527·2021-09-30 09:47
閱讀 2168·2021-09-23 11:21
閱讀 1893·2021-09-09 09:34
閱讀 3493·2019-08-30 15:43
閱讀 1533·2019-08-30 11:07
閱讀 1072·2019-08-29 16:14
閱讀 737·2019-08-29 11:06