本文目錄一覽:
JS常見排序算法
排序算法說明:
(1)對於評述算法優劣術語的說明
穩定 :如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定 :如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序 :所有排序操作都在內存中完成;
外排序 :由於數據太大,因此把數據放在磁盤中,而排序通過磁盤和內存的數據傳輸才能進行;
時間複雜度 : 一個算法執行所耗費的時間。
空間複雜度 : 運行完一個程序所需內存的大小。
(2)排序算法圖片總結:
1.冒泡排序:
解析:1.比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。
2.第一輪的時候最後一個元素應該是最大的一個。
3.按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後一個元素已經是最大的了,所以最後一個元素不用比較。
2.快速排序:
解析:快速排序是對冒泡排序的一種改進,第一趟排序時將數據分成兩部分,一部分比另一部分的所有數據都要小。然後遞歸調用,在兩邊都實行快速排序。
3.插入排序:
解析:
(1) 從第一個元素開始,該元素可以認為已經被排序
(2) 取出下一個元素,在已經排序的元素序列中從後向前掃描
(3) 如果該元素(已排序)大於新元素,將該元素移到下一位置
(4) 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
(5)將新元素插入到下一位置中
(6) 重複步驟2
2.二分查找:
解析:二分查找,也為折半查找。首先要找到一個中間值,通過與中間值比較,大的放又,小的放在左邊。再在兩邊中尋找中間值,持續以上操作,直到找到所在位置為止。
(1)遞歸方法
(2)非遞歸方法
4.選擇排序:
解析:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
以此類推,直到所有元素均排序完畢。
5.希爾排序:
解析:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序
6.歸併排序:
解析:歸併排序是一種穩定的排序方法。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。
7.堆排序:
解析:堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是
小於(或者大於)它的父節點。
8.計數排序:
解析:計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。
9.桶排序:
解析:假設輸入數據服從均勻分佈,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排
10.基數排序:
解析:基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優
先級排序。最後的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。基數排序基於分別排序,分別收集,所以是穩定的。
基數排序 vs 計數排序 vs 桶排序
這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來分配桶 計數排序:每個桶只存儲單一鍵值 桶排序:每個桶存儲一定範圍的數值
JavaScript裏面的算法是什麼意思?
就是算法,比如快速排序算法。
算法都一樣,到了javascript中只能用js的語法寫。算法比較抽象,舉個例子吧!比如你現在要吃飯,要燒水,要做飯,要看電影。怎麼辦呢?你可以先做飯然後吃飯燒水再看電影,但時間花的長,現在如果你先把水燒着,燒水是熱水器的事,你就可以做飯了,飯做完了,這時水也燒好了。現在你再一邊看電影一邊吃飯,這樣你就省了很多時間。這兩種做法就是兩種不同的算法,當然還有其他的做法也就是算法,但是第二種算法肯定是一種好的算法,因為效率比第一種高多了。在編程里,用某種對應的語言把要做的事表達出來就是一種算法,當然我們會想着用最好的算法,所以現在也有算法和數據結構這門學問。
web前端javascript能實現什麼算法或者計算
在Web開發中,JavaScript很重要,算法也很重要。下面整理了一下一些常見的算法在JavaScript下的實現,包括二分法、求字符串長度、數組去重、插入排序、選擇排序、希爾排序、快速排序、冒泡法等等。僅僅是為了練手,不保證高效與美觀,或許還有Bug,有時間再完善吧。
1.二分法:
function binary(items,value){
var startIndex=0,
stopIndex=items.length-1,
midlleIndex=(startIndex+stopIndex)1;
while(items[middleIndex]!=value startIndex
if(items[middleIndex]value){
stopIndex=middleIndex-1;
}else{
startIndex=middleIndex+1;
}
middleIndex=(startIndex+stopIndex)1;
}
return items[middleIndex]!=value ? false:true;
}
2.十六進制顏色值的隨機生成:
function randomColor(){
var arrHex=[“0″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”a”,”b”,”c”,”d”],
strHex=”#”,
index;
for(var i=0;i 6; i++){
index=Math.round(Math.random()*15);
strHex+=arrHex[index];
}
return strHex;
}
一個求字符串長度的方法:
function GetBytes(str){
var len=str.length,
bytes=len;
for(var i=0;i len;i++){
if(str.CharCodeAt255){
bytes++;
}
}
return bytes;
}
3.js實現數組去重:
Array.protype.delRepeat=function(){
var newArray=new Array();
var len=this.length;
for(var i=0;i len;i++){
for(var j=i+1;j len;j++)
{
if(this[i]==this[j])
{
++i;
}
}
newArray.push(this[i]);
}
return newArray;
}
4.插入排序。所謂的插入排序,就是將序列中的第一個元素看成一個有序的子序列,然後不段向後比較交換比較交換。
function insertSort(arr){
var key;
for(var j = 1; j arr.length ; j++){
//排好序的
var i = j – 1;
key = arr[j];
while(i = 0 arr[i] key){
arr[i + 1] = arr[i];
i –;
}
arr[i + 1] = key;
}
return arr;
}
5.選擇排序。其實基本的思想就是從待排序的數組中選擇最小或者最大的,放在起始位置,然後從剩下的數組中選擇最小或者最大的排在這公司數的後面。
function selectionSort(data)
{
var i, j, min, temp , count=data.length;
for(i = 0; i count – 1; i++) {
/* find the minimum */
min = i;
for (j = i+1; j count; j++)
{
if (data[j] data[min])
{ min = j;}
}
/* swap data[i] and data[min] */
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
return data;
}
6.希爾排序,也稱遞減增量排序算法。其實說到底也是插入排序的變種。
function shellSort(array){
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; //
reverse()在維基上看到這個最優的步長較小數組
var i = 0;
var stepArrLength = stepArr.length;
var len = array.length;
var len2 = parseInt(len/2);
for(;i stepArrLength; i++){
if(stepArr[i] len2){
continue;
}
stepSort(stepArr[i]);
}
// 排序一個步長
function stepSort(step){
//console.log(step) 使用的步長統計
var i = 0, j = 0, f, tem, key;
var stepLen = len%step 0 ? parseInt(len/step) + 1 : len/step;
for(;i step; i++){// 依次循環列
for(j=1;/*j stepLen */step * j + i len;
j++){//依次循環每列的每行
tem = f = step * j + i;
key = array[f];
while((tem-=step) = 0){// 依次向上查找
if(array[tem] key){
array[tem+step] = array[tem];
}else{
break;
}
}
array[tem + step ] = key;
}
}
}
return array;
}
7.快速排序。其實說到底快速排序算法就系對冒泡排序的一種改進,採用的就是算法理論中的分治遞歸的思想,說得明白點,它的做法就是:通過一趟排序將待排序的紀錄分割成兩部分,其中一部分的紀錄值比另外一部分的紀錄值要小,就可以繼續分別對這兩部分紀錄進行排序;不段的遞歸實施上面兩個操作,從而實現紀錄值的排序。
function quickSort(arr,l,r){
if(l r){
var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1;
while(true){
while(arr[++i] mid);
while(arr[–j]mid);
if(i=j)break;
var temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
quickSort(arr,l,i-1);
quickSort(arr,j+1,r);
}
return arr;
}
8.冒泡法:
function bullSort(array){
var temp;
for(var i=0;i array.length;i++)
{
for(var j=array.length-1;j i;j–){
if(array[j] array[j-1])
{
temp = array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
}
return array;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/282696.html