摘要:待排序的記錄序列中可能存在兩個或兩個以上的關(guān)鍵字相等的記錄,且在排序前在前面即,若在排序后的序列中任然在前面,則稱所用的排序算法是穩(wěn)定的。基數(shù)排序留各種排序算法比較以上用到的函數(shù)函數(shù)返回生成的數(shù)組結(jié)束
排序 Sorting 排序基本概念
排序是計算機程序設(shè)計中的一種重要操作,他的功能是將一個數(shù)據(jù)元素(或記錄)的任意排列,重新排列成一個按關(guān)鍵字有序的序列。
待排序的記錄序列中可能存在兩個或兩個以上的關(guān)鍵字相等的記錄,且在排序前Ri在Rj前面(即i
如果按照排序過程中依據(jù)的不同原則對內(nèi)部排序進行分類,則可分為
插入排序
交換排序(快速排序)
選擇排序
歸并排序
基數(shù)排序
如果按照工作量來區(qū)分可以分為3類
簡單的排序算法,時間復(fù)雜度為O(n2)
先進的排序算法,時間復(fù)雜度為O(nlogn)
基數(shù)排序,時間復(fù)雜度為O(d*n)
通常,在排序的過程中需要進行下列兩種基本操作,(其中第二種操作可以通過改變記錄的存儲方式來予以避免)
比較兩個關(guān)鍵字大小
將記錄從一個位置移動至另一個位置
待排序的記錄序列可有下列3種存儲方式。
存儲在地址連續(xù)的一組存儲單元上。
靜態(tài)鏈表,記錄之間的次序由指針指示,則實現(xiàn)排序不需要移動記錄
待排序記錄存儲在一組地址連續(xù)的存儲單元內(nèi),同時,另外設(shè)一個指示各個記錄存儲位置的地址向量,在排序過程中不移動記錄本身,而是移動地址向量
中這些記錄的“地址”,在排序結(jié)束后再按照地址向量中的值調(diào)整記錄的存儲位置。
最為簡單的一種排序,基本操作為將一個記錄插入到已經(jīng)排好序的有序表中,從而得到一個新的,記錄增1的有序表。
//直接插入排序,更為高效的應(yīng)該是折半插入排序?≥ function insertSort (Arr) { if (Arr.length <= 1) { return Arr; } var temp; for (var i = 1; i < Arr.length; i++) { //從1開始,第一個不用排序 temp = Arr[i]; //用temp緩存待插入的元素 for (var j = i; j >= 0; j--) { if (temp < Arr[j]) { Arr[j + 1] = Arr[j]; //當(dāng)Arr[i]其他插入排序Arr[j]) { break; //第一種:如果找到了一個比Arr[i]小的Arr[j],則退出循環(huán),結(jié)束 } //第二種,當(dāng)j循環(huán),結(jié)束 } //結(jié)束j循環(huán),將temp中緩存的待插入元素插入 Arr[j + 1] = temp; } }; //insert結(jié)束
折半插入排序 O(n2) 通過減少比較關(guān)鍵字大小次數(shù)來優(yōu)化排序算法。
2路插入排序
表插入排序
希爾排序 O(n3/2)又被稱為"縮小增量排序"。基本思想:先將整個待排記錄序列分割成若干個子序列分別進行直接插入排序,待整個序列中的記錄
“基本有序”時,再對全體記錄進行一次直接插入排序。
function shellSort(Arr) { var gap = Math.floor(Arr.length / 2); while (gap > 0) { for (var i = 0; i < Arr.length; i++) { var temp = Arr[i]; for (var j = i; j >= gap && Arr[j - gap] > temp; j -= gap) { Arr[j] = Arr[j - gap]; } Arr[j] = temp; } gap = Math.floor(gap / 2); } return Arr; }; //shell結(jié)束快速排序 起泡排序 bubble sort
// 起泡排序, function bibbleSort(Arr) { for (var i = Arr.length - 1; i >= 0; i--) { for (var j = 0; j < i; j++) { if (Arr[j] > Arr[j + 1]) { swap(j, j + 1, Arr); } } } return Arr; };快速排序 quick sort
// 一趟快速排序的算法是 // 1.設(shè)置初始值x=0,y=n-1,令keyValuey=Arr[0],2.從Arr[y]開始向前遍歷,如果keyValue>Arr[y],則將Arr[i]和Arr[y]交換,3.從Arr[x]向后遍歷,當(dāng)keyValue選擇排序 簡單的選擇排序 //選擇排序 從待排序的數(shù)組中找出最小值放在最前面 function selectSort(Arr) { for (var i = 0; i < Arr.length; i++) { for (var j = i; j < Arr.length; j++) { if (Arr[i] > Arr[j]) { swap(Arr, i, j); } } } return Arr; }; //select結(jié)束樹形選擇排序留
堆排序 heap sort留!!!
歸并排序 merging sort O(m+n)假設(shè)初始序列含義n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然后兩兩歸并,等到Math.floor(n/2)個長度為2或1的有序子序列,再兩兩歸并,如此重復(fù),直至得到一個長度為n的有序序列為止。
function mergeSort (){ var merge=function(left,right){ var final=[]; while(left.length&&right.length){ final.push(left[0]<=right[0]?left.shift():right.shift()); } return final.concat(left.concat(right)); }; var len=this.length; if(len<2){ return this; } var mid=parseInt(len/2), _left=this.slice(0,mid), _right=this.slice(mid); return merge(_left.mergeSort(),_right.mergeSort()); };基數(shù)排序 radix Sorting留
各種排序算法比較 以上用到的swap函數(shù)//swap函數(shù) function swap(Arr, firPos, secPos) { var temp = Arr[firPos]; Arr[firPos] = Arr[secPos]; Arr[secPos] = temp; return Arr; //返回生成的數(shù)組 } //swap結(jié)束
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/91630.html
摘要:介紹排序算法是算法中最常見的算法之一,我這里要介紹的是排序算法中的三種基本算法冒泡排序選擇排序插入排序,在文章的后面我會對三種算法的速度進行對比。 1.介紹 排序算法是算法中最常見的算法之一,我這里要介紹的是排序算法中的三種基本算法:冒泡排序、選擇排序、插入排序,在文章的后面我會對三種算法的速度進行對比。 2.冒泡排序 冒泡排序其名來源與其算法實現(xiàn),會使得數(shù)組中的元素一個個從數(shù)組一端漂...
摘要:本文對一些排序算法進行了簡單分析,并給出了的代碼實現(xiàn)。平均時間復(fù)雜度不好分析,它是冒泡排序是穩(wěn)定的排序算法。冒泡排序是原地排序算法原地排序指的是空間復(fù)雜度是的排序算法。歸并排序,會將數(shù)組從中間分成左右兩部分。 本文對一些排序算法進行了簡單分析,并給出了 javascript 的代碼實現(xiàn)。因為本文包含了大量的排序算法,所以分析不會非常詳細,適合有對排序算法有一定了解的同學(xué)。本文內(nèi)容其實不...
摘要:上一篇數(shù)據(jù)結(jié)構(gòu)與算法樹寫在前面這是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的最后一篇博客,也是在面試中常常會被問到的一部分內(nèi)容排序和搜索。 上一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_樹 寫在前面 這是《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》的最后一篇博客,也是在面試中常常會被問到的一部分內(nèi)容:排序和搜索。在這篇博客之前,我每每看到排序頭就是大的,心里想著類似冒泡排序,兩層遍歷啪啪啪就完事了,然后再也無心去深入研究排序相...
本篇有7k+字, 系統(tǒng)梳理了js中常見的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復(fù)雜的排序?qū)崿F(xiàn),如果喜歡請點贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導(dǎo)讀 排序算法可以稱得上是我的盲點, 曾幾何時當(dāng)我知道Chrome的Array.prototype.sort使用了快速排序時, 我的內(nèi)心是奔潰的(啥是快排, 我只知道...
閱讀 805·2023-04-25 19:40
閱讀 3407·2023-04-25 17:41
閱讀 2993·2021-11-11 11:01
閱讀 2588·2019-08-30 15:55
閱讀 3218·2019-08-30 15:44
閱讀 1347·2019-08-29 14:07
閱讀 478·2019-08-29 11:23
閱讀 1314·2019-08-27 10:54