久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放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. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      1.6 快速排序

      快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個(gè)項(xiàng)目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見(jiàn)。事實(shí)上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來(lái)。

      快速排序使用分治法(Divide and conquer)策略來(lái)把一個(gè)串行(list)分為兩個(gè)子串行(sub-lists)。

      快速排序又是一種分而治之思想在排序算法上的典型應(yīng)用。本質(zhì)上來(lái)看,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。

      快速排序的名字起的是簡(jiǎn)單粗暴,因?yàn)橐宦?tīng)到這個(gè)名字你就知道它存在的意義,就是快,而且效率高!它是處理大數(shù)據(jù)最快的排序算法之一了。雖然 Worst Case 的時(shí)間復(fù)雜度達(dá)到了 O(n2),但是人家就是優(yōu)秀,在大多數(shù)情況下都比平均時(shí)間復(fù)雜度為 O(n logn) 的排序算法表現(xiàn)要更好,可是這是為什么呢,我也不知道。好在我的強(qiáng)迫癥又犯了,查了 N 多資料終于在《算法藝術(shù)與信息學(xué)競(jìng)賽》上找到了滿(mǎn)意的答案:

      快速排序的最壞運(yùn)行情況是 O(n2),比如說(shuō)順序數(shù)列的快排。但它的平攤期望時(shí)間是 O(nlogn),且 O(nlogn) 記號(hào)中隱含的常數(shù)因子很小,比復(fù)雜度穩(wěn)定等于 O(nlogn) 的歸并排序要小很多。所以,對(duì)絕大多數(shù)順序性較弱的隨機(jī)數(shù)列而言,快速排序總是優(yōu)于歸并排序。

      1. 算法步驟

      1. 從數(shù)列中挑出一個(gè)元素,稱(chēng)為 “基準(zhǔn)”(pivot);

      2. 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱(chēng)為分區(qū)(partition)操作;

      3. 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序;

      2. 動(dòng)圖演示

      1.6 快速排序


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

      JavaScript

      實(shí)例

      function quickSort(arr, left, right) {
          var len = arr.length,
              partitionIndex,
              left = typeof left != ‘number’ ? 0 : left,
              right = typeof right != ‘number’ ? len 1 : right;

          if (left < right) {
              partitionIndex = partition(arr, left, right);
              quickSort(arr, left, partitionIndex1);
              quickSort(arr, partitionIndex+1, right);
          }
          return arr;
      }

      function partition(arr, left ,right) {     // 分區(qū)操作
          var pivot = left,                      // 設(shè)定基準(zhǔn)值(pivot)
              index = pivot + 1;
          for (var i = index; i <= right; i++) {
              if (arr[i] < arr[pivot]) {
                  swap(arr, i, index);
                  index++;
              }        
          }
          swap(arr, pivot, index 1);
          return index1;
      }

      function swap(arr, i, j) {
          var temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
      }
      function partition2(arr, low, high) {
        let pivot = arr[low];
        while (low < high) {
          while (low < high && arr[high] > pivot) {
            high;
          }
          arr[low] = arr[high];
          while (low < high && arr[low] <= pivot) {
            ++low;
          }
          arr[high] = arr[low];
        }
        arr[low] = pivot;
        return low;
      }

      function quickSort2(arr, low, high) {
        if (low < high) {
          let pivot = partition2(arr, low, high);
          quickSort2(arr, low, pivot 1);
          quickSort2(arr, pivot + 1, high);
        }
        return arr;
      }

      Python

      實(shí)例

      def quickSort(arr, left=None, right=None):
          left = 0 if not isinstance(left,(int, float)) else left
          right = len(arr)1 if not isinstance(right,(int, float)) else right
          if left < right:
              partitionIndex = partition(arr, left, right)
              quickSort(arr, left, partitionIndex-1)
              quickSort(arr, partitionIndex+1, right)
          return arr

      def partition(arr, left, right):
          pivot = left
          index = pivot+1
          i = index
          while  i <= right:
              if arr[i] < arr[pivot]:
                  swap(arr, i, index)
                  index+=1
              i+=1
          swap(arr,pivot,index-1)
          return index-1

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

      Go

      實(shí)例

      func quickSort(arr []int) []int {
              return _quickSort(arr, 0, len(arr)1)
      }

      func _quickSort(arr []int, left, right int) []int {
              if left < right {
                      partitionIndex := partition(arr, left, right)
                      _quickSort(arr, left, partitionIndex1)
                      _quickSort(arr, partitionIndex+1, right)
              }
              return arr
      }

      func partition(arr []int, left, right int) int {
              pivot := left
              index := pivot + 1

              for i := index; i <= right; i++ {
                      if arr[i] < arr[pivot] {
                              swap(arr, i, index)
                              index += 1
                      }
              }
              swap(arr, pivot, index1)
              return index 1
      }

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

      C++

      實(shí)例

      //嚴(yán)蔚敏《數(shù)據(jù)結(jié)構(gòu)》標(biāo)準(zhǔn)分割函數(shù)
       Paritition1(int A[], int low, int high) {
         int pivot = A[low];
         while (low < high) {
           while (low < high && A[high] >= pivot) {
             high;
           }
           A[low] = A[high];
           while (low < high && A[low] <= pivot) {
             ++low;
           }
           A[high] = A[low];
         }
         A[low] = pivot;
         return low;
       }

       void QuickSort(int A[], int low, int high) //快排母函數(shù)
       {
         if (low < high) {
           int pivot = Paritition1(A, low, high);
           QuickSort(A, low, pivot 1);
           QuickSort(A, pivot + 1, high);
         }
       }

      Java

      實(shí)例

      public class QuickSort implements IArraySort {

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

              return quickSort(arr, 0, arr.length 1);
          }

          private int[] quickSort(int[] arr, int left, int right) {
              if (left < right) {
                  int partitionIndex = partition(arr, left, right);
                  quickSort(arr, left, partitionIndex 1);
                  quickSort(arr, partitionIndex + 1, right);
              }
              return arr;
          }

          private int partition(int[] arr, int left, int right) {
              // 設(shè)定基準(zhǔn)值(pivot)
              int pivot = left;
              int index = pivot + 1;
              for (int i = index; i <= right; i++) {
                  if (arr[i] < arr[pivot]) {
                      swap(arr, i, index);
                      index++;
                  }
              }
              swap(arr, pivot, index 1);
              return index 1;
          }

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

      }

      PHP

      實(shí)例

      function quickSort($arr)
      {
          if (count($arr) <= 1)
              return $arr;
          $middle = $arr[0];
          $leftArray = array();
          $rightArray = array();

          for ($i = 1; $i < count($arr); $i++) {
              if ($arr[$i] > $middle)
                  $rightArray[] = $arr[$i];
              else
                  $leftArray[] = $arr[$i];
          }
          $leftArray = quickSort($leftArray);
          $leftArray[] = $middle;

          $rightArray = quickSort($rightArray);
          return array_merge($leftArray, $rightArray);
      }

      C

      實(shí)例

      typedef struct _Range {
          int start, end;
      } Range;

      Range new_Range(int s, int e) {
          Range r;
          r.start = s;
          r.end = e;
          return r;
      }

      void swap(int *x, int *y) {
          int t = *x;
          *x = *y;
          *y = t;
      }

      void quick_sort(int arr[], const int len) {
          if (len <= 0)
              return; // 避免len等於負(fù)值時(shí)引發(fā)段錯(cuò)誤(Segment Fault)
          // r[]模擬列表,p為數(shù)量,r[p++]為push,r[–p]為pop且取得元素
          Range r[len];
          int p = 0;
          r[p++] = new_Range(0, len 1);
          while (p) {
              Range range = r[p];
              if (range.start >= range.end)
                  continue;
              int mid = arr[(range.start + range.end) / 2]; // 選取中間點(diǎn)為基準(zhǔn)點(diǎn)
              int left = range.start, right = range.end;
              do {
                  while (arr[left] < mid) ++left;   // 檢測(cè)基準(zhǔn)點(diǎn)左側(cè)是否符合要求
                  while (arr[right] > mid) right; //檢測(cè)基準(zhǔn)點(diǎn)右側(cè)是否符合要求
                  if (left <= right) {
                      swap(&arr[left], &arr[right]);
                      left++;
                      right–;               // 移動(dòng)指針以繼續(xù)
                  }
              } while (left <= right);
              if (range.start < right) r[p++] = new_Range(range.start, right);
              if (range.end > left) r[p++] = new_Range(left, range.end);
          }
      }

      遞歸法

      實(shí)例

      void swap(int *x, int *y) {
          int t = *x;
          *x = *y;
          *y = t;
      }

      void quick_sort_recursive(int arr[], int start, int end) {
          if (start >= end)
              return;
          int mid = arr[end];
          int left = start, right = end 1;
          while (left < right) {
              while (arr[left] < mid && left < right)
                  left++;
              while (arr[right] >= mid && left < right)
                  right–;
              swap(&arr[left], &arr[right]);
          }
          if (arr[left] >= arr[end])
              swap(&arr[left], &arr[end]);
          else
              left++;
          if (left)
              quick_sort_recursive(arr, start, left 1);
          quick_sort_recursive(arr, left + 1, end);
      }

      void quick_sort(int arr[], int len) {
          quick_sort_recursive(arr, 0, len 1);
      }

      C++

      函數(shù)法

      sort(a,a + n);// 排序a[0]-a[n-1]的所有數(shù).

      迭代法

      實(shí)例

      // 參考:http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/
      struct Range {
          int start, end;
          Range(int s = 0, int e = 0) {
              start = s, end = e;
          }
      };
      template <typename T> // 整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定"小於"(<)、"大於"(>)、"不小於"(>=)的運(yùn)算子功能
      void quick_sort(T arr[], const int len) {
          if (len <= 0)
              return; // 避免len等於負(fù)值時(shí)宣告堆疊陣列當(dāng)機(jī)
          // r[]模擬堆疊,p為數(shù)量,r[p++]為push,r[–p]為pop且取得元素
          Range r[len];
          int p = 0;
          r[p++] = Range(0, len 1);
          while (p) {
              Range range = r[p];
              if (range.start >= range.end)
                  continue;
              T mid = arr[range.end];
              int left = range.start, right = range.end 1;
              while (left < right) {
                  while (arr[left] < mid && left < right) left++;
                  while (arr[right] >= mid && left < right) right;
                  std::swap(arr[left], arr[right]);
              }
              if (arr[left] >= arr[range.end])
                  std::swap(arr[left], arr[range.end]);
              else
                  left++;
              r[p++] = Range(range.start, left 1);
              r[p++] = Range(left + 1, range.end);
          }
      }

      遞歸法

      實(shí)例

      template <typename T>
      void quick_sort_recursive(T arr[], int start, int end) {
          if (start >= end)
              return;
          T mid = arr[end];
          int left = start, right = end 1;
          while (left < right) { //在整個(gè)范圍內(nèi)搜尋比樞紐元值小或大的元素,然后將左側(cè)元素與右側(cè)元素交換
              while (arr[left] < mid && left < right) //試圖在左側(cè)找到一個(gè)比樞紐元更大的元素
                  left++;
              while (arr[right] >= mid && left < right) //試圖在右側(cè)找到一個(gè)比樞紐元更小的元素
                  right;
              std::swap(arr[left], arr[right]); //交換元素
          }
          if (arr[left] >= arr[end])
              std::swap(arr[left], arr[end]);
          else
              left++;
          quick_sort_recursive(arr, start, left 1);
          quick_sort_recursive(arr, left + 1, end);
      }
      template <typename T> //整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定"小於"(<)、"大於"(>)、"不小於"(>=)的運(yùn)算子功能
      void quick_sort(T arr[], int len) {
          quick_sort_recursive(arr, 0, len 1);
      }

      參考地址:

      https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/6.quickSort.md

      https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

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