摘要:歸并排序歸并排序前歸并排序后快速排序?qū)τ谝蛔纸o定的記錄,通過一趟排序后,將原序列分為兩部分,其中前一部分的所有記錄均比后一部分的所有記錄小,然后再一次對(duì)前后兩部分的記錄進(jìn)行快速排序,遞歸該過程,指導(dǎo)序列中所有記錄均有序?yàn)橹埂?/p>
堆排序
堆排序的基本思想是:將待排序序列構(gòu)造成一個(gè)大頂堆,此時(shí),整個(gè)序列的最大值就是堆頂?shù)母?jié)點(diǎn)。將其與末尾元素進(jìn)行交換,此時(shí)末尾就為最大值。然后將剩余n-1個(gè)元素重新構(gòu)造成一個(gè)堆,這樣會(huì)得到n個(gè)元素的次小值。如此反復(fù)執(zhí)行,便能得到一個(gè)有序序列了
arr = [20,50,20,40,6,878,70,10,80,30,60,9,44]; console.log("排序之前:" + arr); heapSort(arr); console.log("排序之后:" + arr); function heapSort(arr) { var end = arr.length -1; for (var i = parseInt(arr.length/2) -1; i >= 0; i--) { heapAdjust(arr,i,end); } while(end >= 0) { swap(arr,0,end--); //將堆頂元素與尾節(jié)點(diǎn)交換后,長(zhǎng)度減1,尾元素最大 heapAdjust(arr,0,end); //再次對(duì)堆進(jìn)行調(diào)整 } } function heapAdjust(arr,i,end) { var left = 2*i+1, right, flag; while(left <= end){ //判斷當(dāng)前父節(jié)點(diǎn)有無左節(jié)點(diǎn)(即有無孩子節(jié)點(diǎn),left為左節(jié)點(diǎn)) right = left +1; flag = left; if (right <= end && arr[left] < arr[right]) { flag = right; } if(arr[i] < arr[flag]) //將父節(jié)點(diǎn)與孩子節(jié)點(diǎn)交換(如果上面if為真,則arr[flag]為右節(jié)點(diǎn),如果為假arr[flag]則為左節(jié)點(diǎn)) swap(arr,i,flag); else //說明比孩子節(jié)點(diǎn)都大,直接跳出循環(huán)語(yǔ)句 break; i = flag; left = 2*i+1; } } function swap(arr, i, j){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }歸并排序
歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進(jìn)行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了?
可以將A,B組各自再分成二組。依次類推,當(dāng)分出來的小組只有一個(gè)數(shù)據(jù)時(shí),可以認(rèn)為這個(gè)小組組內(nèi)已經(jīng)達(dá)到了有序,然后再合并相鄰的二個(gè)小組就可以了。這樣通過先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。
// 歸并排序 myarr=[2,43,4,7,4,766,7,3,324,54,5455,89]; console.log("歸并排序前:" + myarr); mergeSort(myarr, myarr.length); console.log("歸并排序后:" + myarr); function mergeSort(arr, len) { var tmpArr = new Array(len); mergeSortDevide(arr,0,len-1,tmpArr); tmpArr = []; return true; } function mergeSortDevide(arr, first, last, tempArr) { if (first < last) { var mid = parseInt((first + last)/2); mergeSortDevide(arr,first,mid,tempArr); mergeSortDevide(arr,mid+1,last,tempArr); mergeArray(arr,first,mid,last,tempArr) } } function mergeArray(arr,first,mid,last,tempArr) { var i = first, j = mid + 1, m = mid, n = last; var k = 0; while(i <= m && j <= n){ if (arr[i] <= arr[j]) { tempArr[k++] = arr[i++]; } else { tempArr[k++] = arr[j++]; } } while(i <= m) { tempArr[k++] = arr[i++]; } while(j <= n) { tempArr[k++] = arr[j++]; } for(t = 0; t < k; t++){ arr[first + t] = tempArr[t]; } }快速排序
對(duì)于一字給定的記錄,通過一趟排序后,將原序列分為兩部分,其中前一部分的所有記錄均比后一部分的所有記錄小,然后再一次對(duì)前后兩部分的記錄進(jìn)行快速排序,遞歸該過程,指導(dǎo)序列中所有記錄均有序?yàn)橹埂?/p>
// 快速排序 function quickSort(arr, low, high) { var i,j,index; if (low>high) return; i = low; j = high; index = arr[i]; while(i < j) { while(iindex) j--; if(i
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95956.html
摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個(gè)待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...
摘要:是穩(wěn)定的排序方法。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。算法實(shí)現(xiàn)選擇排序堆排序描述堆排序是指利用堆積樹堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。 1、插入排序 描述 插入排序的基本操作就是將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個(gè)新的、個(gè)數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為O(n^2)。是穩(wěn)定...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語(yǔ),或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
閱讀 1936·2021-11-15 17:58
閱讀 2131·2021-10-19 11:45
閱讀 3482·2021-09-02 15:40
閱讀 2595·2021-07-25 10:50
閱讀 3745·2019-08-30 15:56
閱讀 3146·2019-08-30 12:44
閱讀 1028·2019-08-26 13:38
閱讀 1869·2019-08-23 18:29