久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      1.7 堆排序

      堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

      1. 大頂堆:每個(gè)節(jié)點(diǎn)的值都大于或等于其子節(jié)點(diǎn)的值,在堆排序算法中用于升序排列;
      2. 小頂堆:每個(gè)節(jié)點(diǎn)的值都小于或等于其子節(jié)點(diǎn)的值,在堆排序算法中用于降序排列;

      堆排序的平均時(shí)間復(fù)雜度為 Ο(nlogn)。

      1. 算法步驟

      1. 創(chuàng)建一個(gè)堆 H[0……n-1];

      2. 把堆首(最大值)和堆尾互換;

      3. 把堆的尺寸縮小 1,并調(diào)用 shift_down(0),目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置;

      4. 重復(fù)步驟 2,直到堆的尺寸為 1。

      2. 動(dòng)圖演示

      1.7 堆排序

      1.7 堆排序


      代碼實(shí)現(xiàn)

      JavaScript

      實(shí)例

      var len;    // 因?yàn)槁暶鞯亩鄠€(gè)函數(shù)都需要數(shù)據(jù)長度,所以把len設(shè)置成為全局變量

      function buildMaxHeap(arr) {   // 建立大頂堆
          len = arr.length;
          for (var i = Math.floor(len/2); i >= 0; i) {
              heapify(arr, i);
          }
      }

      function heapify(arr, i) {     // 堆調(diào)整
          var left = 2 * i + 1,
              right = 2 * i + 2,
              largest = i;

          if (left < len && arr[left] > arr[largest]) {
              largest = left;
          }

          if (right < len && arr[right] > arr[largest]) {
              largest = right;
          }

          if (largest != i) {
              swap(arr, i, largest);
              heapify(arr, largest);
          }
      }

      function swap(arr, i, j) {
          var temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
      }

      function heapSort(arr) {
          buildMaxHeap(arr);

          for (var i = arr.length1; i > 0; i) {
              swap(arr, 0, i);
              len–;
              heapify(arr, 0);
          }
          return arr;
      }

      Python

      實(shí)例

      def buildMaxHeap(arr):
          import math
          for i in range(math.floor(len(arr)/2),1,1):
              heapify(arr,i)

      def heapify(arr, i):
          left = 2*i+1
          right = 2*i+2
          largest = i
          if left < arrLen and arr[left] > arr[largest]:
              largest = left
          if right < arrLen and arr[right] > arr[largest]:
              largest = right

          if largest != i:
              swap(arr, i, largest)
              heapify(arr, largest)

      def swap(arr, i, j):
          arr[i], arr[j] = arr[j], arr[i]

      def heapSort(arr):
          global arrLen
          arrLen = len(arr)
          buildMaxHeap(arr)
          for i in range(len(arr)1,0,1):
              swap(arr,0,i)
              arrLen –=1
              heapify(arr, 0)
          return arr

      Go

      實(shí)例

      func heapSort(arr []int) []int {
              arrLen := len(arr)
              buildMaxHeap(arr, arrLen)
              for i := arrLen 1; i >= 0; i {
                      swap(arr, 0, i)
                      arrLen -= 1
                      heapify(arr, 0, arrLen)
              }
              return arr
      }

      func buildMaxHeap(arr []int, arrLen int) {
              for i := arrLen / 2; i >= 0; i {
                      heapify(arr, i, arrLen)
              }
      }

      func heapify(arr []int, i, arrLen int) {
              left := 2*i + 1
              right := 2*i + 2
              largest := i
              if left < arrLen && arr[left] > arr[largest] {
                      largest = left
              }
              if right < arrLen && arr[right] > arr[largest] {
                      largest = right
              }
              if largest != i {
                      swap(arr, i, largest)
                      heapify(arr, largest, arrLen)
              }
      }

      func swap(arr []int, i, j int) {
              arr[i], arr[j] = arr[j], arr[i]
      }

      Java

      實(shí)例

      public class HeapSort implements IArraySort {

          @Override
          public int[] sort(int[] sourceArray) throws Exception {
              // 對 arr 進(jìn)行拷貝,不改變參數(shù)內(nèi)容
              int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

              int len = arr.length;

              buildMaxHeap(arr, len);

              for (int i = len 1; i > 0; i) {
                  swap(arr, 0, i);
                  len–;
                  heapify(arr, 0, len);
              }
              return arr;
          }

          private void buildMaxHeap(int[] arr, int len) {
              for (int i = (int) Math.floor(len / 2); i >= 0; i) {
                  heapify(arr, i, len);
              }
          }

          private void heapify(int[] arr, int i, int len) {
              int left = 2 * i + 1;
              int right = 2 * i + 2;
              int largest = i;

              if (left < len && arr[left] > arr[largest]) {
                  largest = left;
              }

              if (right < len && arr[right] > arr[largest]) {
                  largest = right;
              }

              if (largest != i) {
                  swap(arr, i, largest);
                  heapify(arr, largest, len);
              }
          }

          private void swap(int[] arr, int i, int j) {
              int temp = arr[i];
              arr[i] = arr[j];
              arr[j] = temp;
          }

      }

      PHP

      實(shí)例

      function buildMaxHeap(&$arr)
      {
          global $len;
          for ($i = floor($len/2); $i >= 0; $i) {
              heapify($arr, $i);
          }
      }

      function heapify(&$arr, $i)
      {
          global $len;
          $left = 2 * $i + 1;
          $right = 2 * $i + 2;
          $largest = $i;

          if ($left < $len && $arr[$left] > $arr[$largest]) {
              $largest = $left;
          }

          if ($right < $len && $arr[$right] > $arr[$largest]) {
              $largest = $right;
          }

          if ($largest != $i) {
              swap($arr, $i, $largest);
              heapify($arr, $largest);
          }
      }

      function swap(&$arr, $i, $j)
      {
          $temp = $arr[$i];
          $arr[$i] = $arr[$j];
          $arr[$j] = $temp;
      }

      function heapSort($arr) {
          global $len;
          $len = count($arr);
          buildMaxHeap($arr);
          for ($i = count($arr) 1; $i > 0; $i) {
              swap($arr, 0, $i);
              $len–;
              heapify($arr, 0);
          }
          return $arr;
      }

      C

      實(shí)例

      #include <stdio.h>
      #include <stdlib.h>

      void swap(int *a, int *b) {
          int temp = *b;
          *b = *a;
          *a = temp;
      }

      void max_heapify(int arr[], int start, int end) {
          // 建立父節(jié)點(diǎn)指標(biāo)和子節(jié)點(diǎn)指標(biāo)
          int dad = start;
          int son = dad * 2 + 1;
          while (son <= end) { // 若子節(jié)點(diǎn)指標(biāo)在範(fàn)圍內(nèi)才做比較
              if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個(gè)子節(jié)點(diǎn)大小,選擇最大的
                  son++;
              if (arr[dad] > arr[son]) //如果父節(jié)點(diǎn)大於子節(jié)點(diǎn)代表調(diào)整完畢,直接跳出函數(shù)
                  return;
              else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點(diǎn)和孫節(jié)點(diǎn)比較
                  swap(&arr[dad], &arr[son]);
                  dad = son;
                  son = dad * 2 + 1;
              }
          }
      }

      void heap_sort(int arr[], int len) {
          int i;
          // 初始化,i從最後一個(gè)父節(jié)點(diǎn)開始調(diào)整
          for (i = len / 2 1; i >= 0; i)
              max_heapify(arr, i, len 1);
          // 先將第一個(gè)元素和已排好元素前一位做交換,再重新調(diào)整,直到排序完畢
          for (i = len 1; i > 0; i) {
              swap(&arr[0], &arr[i]);
              max_heapify(arr, 0, i 1);
          }
      }

      int main() {
          int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
          int len = (int) sizeof(arr) / sizeof(*arr);
          heap_sort(arr, len);
          int i;
          for (i = 0; i < len; i++)
              printf("%d ", arr[i]);
          printf("n");
          return 0;
      }

      C++

      實(shí)例

      #include <iostream>
      #include <algorithm>
      using namespace std;

      void max_heapify(int arr[], int start, int end) {
          // 建立父節(jié)點(diǎn)指標(biāo)和子節(jié)點(diǎn)指標(biāo)
          int dad = start;
          int son = dad * 2 + 1;
          while (son <= end) { // 若子節(jié)點(diǎn)指標(biāo)在範(fàn)圍內(nèi)才做比較
              if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個(gè)子節(jié)點(diǎn)大小,選擇最大的
                  son++;
              if (arr[dad] > arr[son]) // 如果父節(jié)點(diǎn)大於子節(jié)點(diǎn)代表調(diào)整完畢,直接跳出函數(shù)
                  return;
              else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點(diǎn)和孫節(jié)點(diǎn)比較
                  swap(arr[dad], arr[son]);
                  dad = son;
                  son = dad * 2 + 1;
              }
          }
      }

      void heap_sort(int arr[], int len) {
          // 初始化,i從最後一個(gè)父節(jié)點(diǎn)開始調(diào)整
          for (int i = len / 2 1; i >= 0; i)
              max_heapify(arr, i, len 1);
          // 先將第一個(gè)元素和已經(jīng)排好的元素前一位做交換,再從新調(diào)整(剛調(diào)整的元素之前的元素),直到排序完畢
          for (int i = len 1; i > 0; i) {
              swap(arr[0], arr[i]);
              max_heapify(arr, 0, i 1);
          }
      }

      int main() {
          int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
          int len = (int) sizeof(arr) / sizeof(*arr);
          heap_sort(arr, len);
          for (int i = 0; i < len; i++)
              cout << arr[i] << ‘ ‘;
          cout << endl;
          return 0;
      }

      參考文章:

      https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/7.heapSort.md

      https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)