堆排序的基本思想是:将待排序序列构形成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。而后将剩余n-1个元素从新构形成一个堆,这样会获得n个元素的次小值。如此反复执行,便能获得一个有序序列了数组
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--); //将堆顶元素与尾节点交换后,长度减1,尾元素最大 heapAdjust(arr,0,end); //再次对堆进行调整 } } function heapAdjust(arr,i,end) { var left = 2*i+1, right, flag; while(left <= end){ //判断当前父节点有无左节点(即有无孩子节点,left为左节点) right = left +1; flag = left; if (right <= end && arr[left] < arr[right]) { flag = right; } if(arr[i] < arr[flag]) //将父节点与孩子节点交换(若是上面if为真,则arr[flag]为右节点,若是为假arr[flag]则为左节点) swap(arr,i,flag); else //说明比孩子节点都大,直接跳出循环语句 break; i = flag; left = 2*i+1; } } function swap(arr, i, j){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
归并排序,其的基本思路就是将数组分红二组A,B,若是这二组组内的数据都是有序的,那么就能够很方便的将这二组数据进行排序。如何让这二组组内数据有序了?ide
能够将A,B组各自再分红二组。依次类推,当分出来的小组只有一个数据时,能够认为这个小组组内已经达到了有序,而后再合并相邻的二个小组就能够了。这样经过先递归的分解数列,再合并数列就完成了归并排序。ui
// 归并排序 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]; } }
对于一字给定的记录,经过一趟排序后,将原序列分为两部分,其中前一部分的全部记录均比后一部分的全部记录小,而后再一次对先后两部分的记录进行快速排序,递归该过程,指导序列中全部记录均有序为止。code
// 快速排序 function quickSort(arr, low, high) { var i,j,index; if (low>high) return; i = low; j = high; index = arr[i]; while(i < j) { while(i<j && arr[j] > index) j--; if(i<j) arr[i++] = arr[j]; while(i<j && arr[i] < index) i++; if (i < j) arr[j--] = arr[i]; } arr[i] = index; quickSort(arr, low, i-1); quickSort(arr, i+1, high); } arr3=[3,2,8,12,0,43,21,16,68,78,4]; quickSort(arr3,0,arr3.length-1); console.log(arr3);