日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解快速排序

相信我們?cè)跊]接觸過排序知識(shí)之前,一定會(huì)覺得快速排序非常具有魅力,不因別的單純快排這個(gè)名字就讓人不明覺厲,但是了解一個(gè)算法不應(yīng)該只知道code,了解思想,應(yīng)用非常重要。

成都創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)宕昌,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實(shí)上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來。

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

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

快速排序的名字起的是簡(jiǎn)單粗暴,因?yàn)橐宦牭竭@個(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)賽》上找到了滿意的答案:

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

1. 算法步驟

  1. 從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);
  2. 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作;
  3. 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序;

2. 動(dòng)圖演示

代碼實(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 return arr;
}

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

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 while (low  pivot) {
     --high;
   }
   arr[low] = arr[high];
   while (low return low;
}

function quickSort2(arr, low, high) {
 if (low 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 return arr

def partition(arr, left, right):
   pivot = left
   index = pivot+1
   i = index
   while  i if arr[i] 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 return arr
}

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

       for i := index; i if arr[i] 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 while (low = pivot) {
      --high;
    }
    A[low] = A[high];
    while (low return low;
}

void QuickSort(int A[], int low, int high) //快排母函數(shù)
{
  if (low 

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 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 if (arr[i] 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) return $arr;
   $middle = $arr[0];
   $leftArray = array();
   $rightArray = array();

   for ($i = 1; $i $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 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] while (arr[right] > mid) --right; //檢測(cè)基準(zhǔn)點(diǎn)右側(cè)是否符合要求
           if (left while (left if (range.start 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 while (arr[left] while (arr[right] >= mid && left 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  // 整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定"小於"("大於"(>)、"不小於"(>=)的運(yùn)算子功能
void quick_sort(T arr[], const int len) {
   if (len 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 while (arr[left] while (arr[right] >= mid && left 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
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 while (arr[left] while (arr[right] >= mid && left 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  //整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定"小於"("大於"(>)、"不小於"(>=)的運(yùn)算子功能
void quick_sort(T arr[], int len) {
   quick_sort_recursive(arr, 0, len - 1);
}

文章標(biāo)題:詳解快速排序
轉(zhuǎn)載來源:http://www.5511xx.com/article/dphjdog.html