最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實現(xiàn)的選擇排序算法實例分析

 更新時間:2017年04月14日 11:32:38   作者:布瑞澤的童話  
這篇文章主要介紹了JavaScript實現(xiàn)的選擇排序算法,結(jié)合實例形式分析了選擇排序的原理、實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了JavaScript實現(xiàn)的選擇排序算法。分享給大家供大家參考,具體如下:

簡單選擇排序是人們最熟悉的比較方式,其算法思想為:從數(shù)組的開頭開始,將第一個元素和其他元素進行比較。檢查完所有元素后,最小的元素會被放到數(shù)組的第一個位置,然后算法會從第二個位置繼續(xù)。這個過程會一直進行,當(dāng)進行到數(shù)組的倒數(shù)第二個位置時,所有的數(shù)據(jù)便完成了排序。

代碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript選擇排序</title>
</head>
<body>
<script type="text/javascript">
 function selectSort(nums){//選擇排序
  var min;//最小值
  for(var outer=0;outer<nums.length-1;outer++){//外循環(huán)選中元素
   min=outer;
   for(var inner=outer+1;inner<=nums.length;++inner){
    if(nums[inner]<nums[min]){//如果內(nèi)循環(huán)中元素比選中元素小
     min=inner;//將其標(biāo)為最小元素
    }//直到每次外循環(huán)的最小元素
    swap(nums,outer,min);//最小值被調(diào)整到合適的位置
   }
  }
 }
 function swap(arr,i,j){//交換位置
  var temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
 }
 function show(nums){//顯示數(shù)組
  for(var i=0;i<nums.length;i++){
   document.write(nums[i]+' ');
  }
  document.write('<br>');
 }
 var nums=[6,8,0,6,7,4,3,5,5,10];
 show(nums);//6 8 0 6 7 4 3 5 5 10
 selectSort(nums);
 show(nums);//0 3 4 5 5 6 6 7 9 10
</script>
</body>
</html>

分析可得,簡單選擇排序的時間復(fù)雜度為O(n2)。選擇排序的主要操作是進行關(guān)鍵字之間的比較,因此改進簡單選擇排序應(yīng)該從如何減少比較出發(fā)。其實現(xiàn)實生活中就有一個很好的例子,就是比賽總的錦標(biāo)賽。8個人中選出冠軍其實不需要7+6+5=18場比賽,可以通過兩兩比較也就是11場比賽。這種方法叫做樹形選擇排序

樹形選擇排序是一種按照錦標(biāo)賽的思想進行選擇排序的方法,首先對n個記錄的關(guān)鍵字進行兩兩比較,然后在其中n/2個較小者之間再進行兩兩比較,直到找出最小關(guān)鍵字??梢酝ㄟ^一個完全二叉樹來表示,由于含有n個結(jié)點的完全二叉樹的深度為log2n+1,所以排序過程中每選擇一個次小關(guān)鍵字僅需要log2n次操作,所以其時間復(fù)雜度O(nlog2n),但是這種排序有一種缺點就是占用空間大。

所以我們需要介紹一種更加優(yōu)秀的排序,也就是堆排序。

附:堆排序算法

堆排序只需要一個記錄大小的輔助空間,每個待排序的記錄僅占用一個存儲空間。

堆排序利用了大根堆(或小根堆)堆頂記錄的關(guān)鍵字最大(或最?。┻@一特征,使得當(dāng)前無序區(qū)中選取最大(或最?。╆P(guān)鍵字的記錄變得簡單。我們以大跟堆為例子,排序的基本操作如下:

首先是建堆,建堆就是不斷調(diào)整堆的過程,從len2處開始調(diào)整,一直到第一個節(jié)點,此處len是堆中元素的個數(shù)。建堆的過程是線性的過程,從len2到0處一直調(diào)用調(diào)整堆的過程,建堆的時間復(fù)雜度為O(n)。
接下來是調(diào)整堆,調(diào)整堆在建堆和堆排序的過程中都會用到,利用的思想是比較節(jié)點i和它的孩子節(jié)點left(i)和right(i),選出三者最大(或最?。┱?,如果最大(?。┲挡皇枪?jié)點i而是它的一個子節(jié)點,那么交換兩個節(jié)點,然后繼續(xù)遞歸。
然后是堆排序將堆的根節(jié)點取出,最后一個元素替換根節(jié)點,將前面len-1個節(jié)點繼續(xù)進行堆調(diào)整的過程,然后再講根節(jié)點取出,直到所有結(jié)點取出。調(diào)整堆的時間復(fù)雜度為O(log2n)
所以堆排序的時間復(fù)雜度為O(nlog2n)。堆排序是就地排序,其輔助空間為O(1)。但是它不穩(wěn)定,(排序的穩(wěn)定性是指如果在排序的序列中,存在前后相同的兩個元素的話,排序前 和排序后他們的相對位置不發(fā)生變化)。

下面模擬建堆的過程:

堆排序?qū)τ谟涗洈?shù)較少的文件并不值得提倡,但是對于n較大的文件還是挺有效的。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

最新評論

信宜市| 嫩江县| 山阳县| 荣昌县| 呼和浩特市| 靖边县| 共和县| 黔南| 辉南县| 金湖县| 双峰县| 衡南县| 厦门市| 集贤县| 邯郸县| 白朗县| 沁阳市| 乾安县| 岫岩| 中卫市| 静海县| 武胜县| 灵川县| 遂宁市| 哈尔滨市| 怀仁县| 儋州市| 古蔺县| 梅河口市| 久治县| 沁阳市| 建水县| 扬州市| 鹤庆县| 凌海市| 祁阳县| 噶尔县| 赤峰市| 麻城市| 江达县| 江城|