摘要:基本概念時(shí)間復(fù)雜度算法執(zhí)行所耗費(fèi)的時(shí)間。內(nèi)排序所有排序操作都在內(nèi)存中完成。常用的排序算法冒泡排序基本概念依次比較相鄰的兩個(gè)數(shù)將小數(shù)放在前面,大數(shù)放在后面。實(shí)現(xiàn)原理通過(guò)遞歸的方式將數(shù)據(jù)依次分解為包含較小元素和較大元素的不同子序列。
1:基本概念
時(shí)間復(fù)雜度:算法執(zhí)行所耗費(fèi)的時(shí)間。
這個(gè)復(fù)雜度直接和樣本的個(gè)數(shù)有關(guān),復(fù)雜度反映了算法的性能,一般來(lái)說(shuō),復(fù)雜度越低,算法所消耗的時(shí)間越短。
/* O(N1) */ for (var i = 0; i < data.length; i++) { ... } /* O(N2) */ for (var i = 0; i < data.length; i++) { for (var j = 0; j < data.length; j++) { ... } }
空間復(fù)雜度:運(yùn)行一個(gè)程序所需內(nèi)存的大小。
空間復(fù)雜度和時(shí)間復(fù)雜度是對(duì)立的,比如說(shuō),時(shí)間復(fù)雜度越高,空間復(fù)雜度越低;反之則相反。
內(nèi)排序:所有排序操作都在內(nèi)存中完成。
2:常用的排序算法 冒泡排序(Bubble Sort)基本概念:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。
時(shí)間復(fù)雜度:O(N2)。
實(shí)現(xiàn)原理:重復(fù)的走訪要排序的數(shù)列,一次比較兩個(gè)元素,大的元素放后面,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。
代碼實(shí)現(xiàn):有兩層循環(huán)嵌套,外循環(huán)遍歷數(shù)組的每一項(xiàng),內(nèi)循環(huán)用于兩兩元素的比較,每次內(nèi)循環(huán)減1。
function bubbleSort(arr) { var length = arr.length; for (var i = 0; i < length; i++) { for (var j = 0; j < length - 1 - i; j++) { if (arr[j] > arr[j+1]) { [arr[j], arr[j+1]] = [arr[j+1], arr[j]]; } } } return arr; }選擇排序(Selection Sort)
時(shí)間復(fù)雜度:O(N2)。
實(shí)現(xiàn)原理:從未排序的序列中找到最小(大)的元素存放到指定的起始位置,再?gòu)奈磁判虻男蛄性刂兄貜?fù)上一步,直至排序完成。
代碼實(shí)現(xiàn):兩層循環(huán)嵌套,外循環(huán)遍歷數(shù)組的每一項(xiàng),內(nèi)循環(huán)用于找到樣本里面的最小值或者最大值,每次內(nèi)循環(huán)減1。
function selectionSort(arr) { var length = arr.length; var minIndex, temp; for (var i = 0; i < length - 1; i++) { minIndex = i; for (var j = i + 1; j < length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } [arr[minIndex], arr[i]] = [arr[i], arr[minIndex]]; } return arr; }快速排序(Quick Sort)
時(shí)間復(fù)雜度:O(N * log2N)。
實(shí)現(xiàn)原理:通過(guò)遞歸的方式將數(shù)據(jù)依次分解為包含較小元素和較大元素的不同子序列。
代碼實(shí)現(xiàn):找到一個(gè)數(shù)作為參考,然后比這個(gè)數(shù)字大的放在數(shù)字左邊,比它小的放在右邊,分別再對(duì)左右兩邊的序列做相同的操作。
function partition(arr, low, high) { let pivot = arr[low]; while (low < high) { while (low < high && arr[high] > pivot) { --high; } arr[low] = arr[high]; while (low < high && arr[low] <= pivot) { ++low; } arr[high] = arr[low]; } arr[low] = pivot; return low; } function quickSort(arr, low, high) { if (low < high) { let pivot = partition(arr, low, high); quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } return arr; }插入排序(Insertion Sort)
時(shí)間復(fù)雜度:O(N2)。
實(shí)現(xiàn)原理:構(gòu)建一個(gè)有序序列,未排序數(shù)據(jù)在已排序序列中從后向前掃描,找到正確位置插入。
代碼實(shí)現(xiàn):兩層循環(huán)嵌套,創(chuàng)建已排序數(shù)組, 起始包含數(shù)組的第一個(gè)元素,比這個(gè)數(shù)字大的放在數(shù)字左邊, 比它小的放在右邊。
function insertSort(arr) { for(let i = 1; i < arr.length; i++) { for(let j = i; j > 0; j--) { if(arr[j] < arr[j-1]) { [arr[j], arr[j-1]] = [arr[j-1], arr[j]]; } else { break; } } } return arr; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106395.html
摘要:快速排序是不穩(wěn)定的排序算法。瀏覽器的實(shí)現(xiàn)不同有什么影響排序算法不穩(wěn)定有什么影響舉個(gè)例子某市的機(jī)動(dòng)車(chē)牌照拍賣(mài)系統(tǒng),最終中標(biāo)的規(guī)則為按價(jià)格進(jìn)行倒排序相同價(jià)格則按照競(jìng)標(biāo)順位即價(jià)格提交時(shí)間進(jìn)行正排序。 本文要解決的問(wèn)題 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一種直觀的方式展示 Array.prototype.sort 的時(shí)間復(fù)雜度,看看它有多快? 3、...
摘要:常見(jiàn)的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見(jiàn)的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見(jiàn)的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見(jiàn)的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見(jiàn)的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見(jiàn)的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:代碼實(shí)現(xiàn)六堆排序算法簡(jiǎn)介堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。九計(jì)數(shù)排序算法簡(jiǎn)介計(jì)數(shù)排序是一種穩(wěn)定的排序算法。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。 贊助我以寫(xiě)出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 1、插入排序 1)算法簡(jiǎn)介 插入排序(Insertion-Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法。它...
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過(guò)程與視頻講解。該倉(cāng)庫(kù)包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會(huì)的個(gè)代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會(huì)走得...
閱讀 1701·2021-09-26 09:55
閱讀 3734·2021-09-22 15:31
閱讀 7427·2021-09-22 15:12
閱讀 2219·2021-09-22 10:02
閱讀 4693·2021-09-04 16:40
閱讀 1075·2019-08-30 15:55
閱讀 3031·2019-08-30 12:56
閱讀 1821·2019-08-30 12:44