JavaScript實現堆排序,歸併排序,快速排序

堆排序

堆排序的基本思想是:將待排序序列構形成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就爲最大值。而後將剩餘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);
相關文章
相關標籤/搜索