日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

?????¨????o?????3??1?JavaScript?????°

筆試面試經(jīng)常涉及各種算法,本文簡要介紹常用的一些算法,并用JAVAScript實現(xiàn)。

1、插入排序

1)算法簡介插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實現(xiàn)上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。2)算法描述和實現(xiàn)一般來說,插入排序都采用in-place在數(shù)組上實現(xiàn)。具體算法描述如下:

  • 從第一個元素開始,該元素可以認為已經(jīng)被排序;

  • 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描;

  • 如果該元素(已排序)大于新元素,將該元素移到下一位置;

  • 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;

  • 將新元素插入到該位置后;

  • 重復(fù)步驟2~5。

  • JavaScript代碼實現(xiàn):

  • functioninsertionSort(array){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array'){ for(vari = 1;i < array.length;i++){ varkey = array[i]; varj = i - 1; while(j >= 0 && array[j] > key){ array[j + 1] = array[j]; j--; } array[j + 1] = key; } returnarray; }else{ return'array is not an Array!'; }}


  • 3)算法分析

  • 最佳情況:輸入數(shù)組按升序排列。T(n) = O(n)

  • 最壞情況:輸入數(shù)組按降序排列。T(n) = O(n2)

  • 平均情況:T(n) = O(n2)

二、二分插入排序

1)算法簡介二分插入(Binary-insert-sort)排序是一種在直接插入排序算法上進行小改動的排序算法。其與直接插入排序算法最大的區(qū)別在于查找插入位置時使用的是二分查找的方式,在速度上有一定提升。2)算法描述和實現(xiàn)一般來說,插入排序都采用in-place在數(shù)組上實現(xiàn)。具體算法描述如下:

  • 從第一個元素開始,該元素可以認為已經(jīng)被排序;

  • 取出下一個元素,在已經(jīng)排序的元素序列中二分查找到第一個比它大的數(shù)的位置;

  • 將新元素插入到該位置后;

  • 重復(fù)上述兩步。

  • JavaScript代碼實現(xiàn):

  • functionbinaryInsertionSort(array){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array'){ for(vari = 1;i < array.length;i++){ varkey = array[i],left = 0,right = i - 1; while(left <= right){ varmiddle = parseInt((left + right) / 2); if(key < array[middle]){ right = middle - 1; }else{ left = middle + 1; } } for(varj = i - 1;j >= left;j--){ array[j + 1] = array[j]; } array[left] = key; } returnarray; }else{ return'array is not an Array!'; }}


  • 3)算法分析

  • 最佳情況:T(n) = O(nlogn)

  • 最差情況:T(n) = O(n2)

  • 平均情況:T(n) = O(n2)

三、選擇排序

1)算法簡介選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。2)算法描述和實現(xiàn)n個記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:

  • 初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空;

  • 第i趟排序(i=1,2,3…n-1)開始時,當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當(dāng)前無序區(qū)中選出關(guān)鍵字最小的記錄 R[k],將它與無序區(qū)的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū);

  • n-1趟結(jié)束,數(shù)組有序化了。

  • JavaScript代碼實現(xiàn):

  • functionselectionSort(array){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array'){ varlen = array.length,temp; for(vari = 0;i < len - 1;i++){ varmin = array[i]; for(varj = i + 1;j < len;j++){ if(array[j] < min){ temp = min; min = array[j]; array[j] = temp; } } array[i] = min; } returnarray; }else{ return'array is not an Array!'; }}


  • 3)算法分析

  • 最佳情況:T(n) = O(n2)

  • 最差情況:T(n) = O(n2)

  • 平均情況:T(n) = O(n2)

四、冒泡排序

1)算法簡介冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端。2)算法描述和實現(xiàn)具體算法描述如下:

  • 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;

  • 對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對,這樣在最后的元素應(yīng)該會是最大的數(shù);

  • 針對所有的元素重復(fù)以上的步驟,除了最后一個;

  • 重復(fù)步驟1~3,直到排序完成。

  • functionbubbleSort(array){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array'){ varlen = array.length,temp; for(vari = 0;i < len - 1;i++){ for(varj = len - 1;j >= i;j--){ if(array[j] < array[j - 1]){ temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } returnarray; }else{ return'array is not an Array!'; }}


  • 3)算法分析

  • 最佳情況:T(n) = O(n)

  • 最差情況:T(n) = O(n2)

  • 平均情況:T(n) = O(n2)

五、快速排序

1)算法簡介快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟毩⒌膬刹糠郑渲幸徊糠钟涗浀年P(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。2)算法描述和實現(xiàn)快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

  • 從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”(pivot);

  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作;

  • 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

  • //方法一functionquickSort(array,left,right){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array' && typeofleft === 'number' && typeofright === 'number'){ if(left < right){ varx = array[right],i = left - 1,temp; for(varj = left;j <= right;j++){ if(array[j] <= x){ i++; temp = array[i]; array[i] = array[j]; array[j] = temp; } } quickSort(array,left,i - 1); quickSort(array,i + 1,right); }; }else{ return'array is not an Array or left or right is not a number!'; }} varaaa = [3,5,2,9,1];quickSort(aaa,0,aaa.length - 1);console.log(aaa);


  • //方法二varquickSort = function(arr){  if(arr.length <= 1){returnarr;}  varpivotIndex = Math.floor(arr.length / 2);  varpivot = arr.splice(pivotIndex,1)[0];  varleft = [];  varright = [];  for(vari = 0;i < arr.length;i++){    if(arr[i] < pivot){      left.push(arr[i]);    }else{      right.push(arr[i]);    }  }  returnquickSort(left).concat([pivot],quickSort(right));};3)算法分析

  • 最佳情況:T(n) = O(nlogn)

  • 最差情況:T(n) = O(n2)

  • 平均情況:T(n) = O(nlogn)

六、堆排序

1)算法簡介堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。堆積是一個近似完全二叉樹的結(jié)構(gòu),并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點。2)算法描述和實現(xiàn)具體算法描述如下:

  • 將初始待排序關(guān)鍵字序列(R1,R2….Rn)構(gòu)建成大頂堆,此堆為初始的無序區(qū);

  • 將堆頂元素R[1]與最后一個元素R[n]交換,此時得到新的無序區(qū)(R1,R2,……Rn-1)和新的有序區(qū)(Rn),且滿足R[1,2…n-1]<=R[n];

  • 由于交換后新的堆頂R[1]可能違反堆的性質(zhì),因此需要對當(dāng)前無序區(qū)(R1,R2,……Rn-1)調(diào)整為新堆,然后再次將R[1]與無序區(qū)最后一個元素交換,得到新的無序區(qū)(R1,R2….Rn-2)和新的有序區(qū)(Rn-1,Rn)。不斷重復(fù)此過程直到有序區(qū)的元素個數(shù)為n-1,則整個排序過程完成。

  • /*方法說明:堆排序@param array 待排序數(shù)組*/ functionheapSort(array){ if(Object.prototype.toString.call(array).slice(8, -1) === 'Array'){//建堆 varheapSize = array.length,temp; for(vari = Math.floor(heapSize / 2);i >= 0;i--){ heapify(array,i,heapSize); } //堆排序 for(varj = heapSize - 1;j >= 1;j--){ temp = array[0]; array[0] = array[j]; array[j] = temp; heapify(array,0, --heapSize); } }else{ return'array is not an Array!'; }}/*方法說明:維護堆的性質(zhì)@param arr 數(shù)組@param x 數(shù)組下標(biāo)@param len 堆大小*/functionheapify(arr,x,len){ if(Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeofx === 'number'){ varl = 2 * x,r = 2 * x + 1,largest = x,temp; if(l < len && arr[l] > arr[largest]){ largest = l; } if(r < len && arr[r] > arr[largest]){ largest = r; } if(largest != x){ temp = arr[x]; arr[x] = arr[largest]; arr[largest] = temp; heapify(arr,largest,len); } }else{ return'arr is not an Array or x is not a number!'; }


  • 3)算法分析

  • 最佳情況:T(n) = O(nlogn)

  • 最差情況:T(n) = O(nlogn)

  • 平均情況:T(n) = O(nlogn)

七、歸并排序

1)算法簡介歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。歸并排序是一種穩(wěn)定的排序方法。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2-路歸并。2)算法描述和實現(xiàn)具體算法描述如下:

  • 把長度為n的輸入序列分成兩個長度為n/2的子序列;

  • 對這兩個子序列分別采用歸并排序;

  • 將兩個排序好的子序列合并成一個最終的排序序列。

  • functionmergeSort(array,p,r){ if(p < r){ varq = Math.floor((p + r) / 2); mergeSort(array,p,q); mergeSort(array,q + 1,r); merge(array,p,q,r); }}functionmerge(array,p,q,r){ varn1 = q - p + 1,n2 = r - q,left = [],right = [],m = n = 0; for(vari = 0;i < n1;i++){ left[i] = array[p + i]; } for(varj = 0;j < n2;j++){ right[j] = array[q + 1 + j]; } left[n1] = right[n2] = Number.MAX_VALUE; for(vark = p;k <= r;k++){ if(left[m] <= right[n]){ array[k] = left[m]; m++; }else{ array[k] = right[n]; n++; } }}


  • 3)算法分析

  • 最佳情況:T(n) = O(n)

  • 最差情況:T(n) = O(nlogn)

  • 平均情況:T(n) = O(nlogn)

八、桶排序

1)算法簡介桶排序 (Bucket sort)的工作的原理:假設(shè)輸入數(shù)據(jù)服從均勻分布,將數(shù)據(jù)分到有限數(shù)量的桶里,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續(xù)使用桶排序進行排序)。2)算法描述和實現(xiàn)具體算法描述如下:

  • 設(shè)置一個定量的數(shù)組當(dāng)作空桶;

  • 遍歷輸入數(shù)據(jù),并且把數(shù)據(jù)一個一個放到對應(yīng)的桶里去;

  • 對每個不是空的桶進行排序;

  • 從不是空的桶里把排好序的數(shù)據(jù)拼接起來。

  • /*方法說明:桶排序@param array 數(shù)組@param num 桶的數(shù)量*/functionbucketSort(array,num){ if(array.length <= 1){ returnarray; } varlen = array.length,buckets = [],result = [],min = max = array[0],regex = '/^[1-9]+[0-9]*$/',space,n = 0; num = num || ((num > 1 && regex.test(num))?num : 10); for(vari = 1;i < len;i++){ min = min <= array[i]?min : array[i]; max = max >= array[i]?max : array[i]; } space = (max - min + 1) / num; for(varj = 0;j < len;j++){ varindex = Math.floor((array[j] - min) / space); if(buckets[index]){ // 非空桶,插入排序 vark = buckets[index].length - 1; while(k >= 0 && buckets[index][k] > array[j]){ buckets[index][k + 1] = buckets[index][k]; k--; } buckets[index][k + 1] = array[j]; }else{ //空桶,初始化 buckets[index] = []; buckets[index].push(array[j]); } } while(n < num){ result = result.concat(buckets[n]); n++; } returnresult;}


  • 3)算法分析桶排序最好情況下使用線性時間O(n),桶排序的時間復(fù)雜度,取決與對各個桶之間數(shù)據(jù)進行排序的時間復(fù)雜度,因為其它部分的時間復(fù)雜度都為O(n)。很顯然,桶劃分的越小,各個桶之間的數(shù)據(jù)越少,排序所用的時間也會越少。但相應(yīng)的空間消耗就會增大。

九、計數(shù)排序

1)算法簡介計數(shù)排序(Counting sort)是一種穩(wěn)定的排序算法。計數(shù)排序使用一個額外的數(shù)組C,其中第i個元素是待排序數(shù)組A中值等于i的元素的個數(shù)。然后根據(jù)數(shù)組C來將A中的元素排到正確的位置。它只能對整數(shù)進行排序。2)算法描述和實現(xiàn)具體算法描述如下:

  • 找出待排序的數(shù)組中最大和最小的元素;

  • 統(tǒng)計數(shù)組中每個值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項;

  • 對所有的計數(shù)累加(從C中的第一個元素開始,每一項和前一項相加);

  • 反向填充目標(biāo)數(shù)組:將每個元素i放在新數(shù)組的第C(i)項,每放一個元素就將C(i)減去1。

  • functioncountingSort(array){ varlen = array.length,B = [],C = [],min = max = array[0]; for(vari = 0;i < len;i++){ min = min <= array[i]?min : array[i]; max = max >= array[i]?max : array[i]; C[array[i]] = C[array[i]]?C[array[i]] + 1 : 1; } for(varj = min;j < max;j++){ C[j + 1] = (C[j + 1] || 0) + (C[j] || 0); } for(vark = len - 1;k >=0;k--){ B[C[array[k]] - 1] = array[k]; C[array[k]]--; } returnB;}


  • 3)算法分析當(dāng)輸入的元素是n 個0到k之間的整數(shù)時,它的運行時間是 O(n + k)。計數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。由于用來計數(shù)的數(shù)組C的長度取決于待排序數(shù)組中數(shù)據(jù)的范圍(等于待排序數(shù)組的最大值與最小值的差加上1),這使得計數(shù)排序?qū)τ跀?shù)據(jù)范圍很大的數(shù)組,需要大量時間和內(nèi)存。

歡迎在留言區(qū)留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發(fā),學(xué)習(xí)能力的提升上有新的認識,歡迎轉(zhuǎn)發(fā)分享給更多人。

分享到:
標(biāo)簽:算法 排序
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定