快速排序---簡解
快速排序是真的塊。
簡單的說一下快排的思想:
第一步,找出一個鍵值,通常取第一個元素,用temp中間變數暫存,left和right為排序範圍的左邊界和右邊界。
第二步、從右邊找出比temp小的放入i下標的位置。i++。
第三步、從i+1的位置往後找到比temp大的值放入j下標處。
第四步、知道i >=j..
第一次排序做好了,然後重複步驟。。排序left到j - 1,i+1 到right。
void quickSort(int a[],int left,int right) { int i = left; int j = right; int temp = a[left]; if(i >= j ) //說明不需要排序了 return; while(i != j) { while(i < j && a[j] >= temp)//尋找比temp小的值 j--; if(i < j) a[i] = a[j];//把小的值放入 while(i < j && a[i] <= temp)//尋找比temp大的值 i++; if(i < j) a[j] = a[i]; } a[i] = temp; quickSort(a,left,j-1); quickSort(a,i+1,rigth); }
快速排序具有最好的平均效能(average behavior),但最壞效能(worst case behavior)和插入排序相同,也是O(n^2)。比如一個序列5,4,3,2,1,要排為1,2,3,4,5。按照快速排序方法,每次只會有一個數據進入正確順序,不能把資料分成大小相當的兩份,很明顯,排序的過程就成了一個歪脖子樹,樹的深度為n,那時間複雜度就成了O(n^2)。儘管如此,需要排序的情況幾乎都是亂序的,自然效能就保證了。據書上的測試圖來看,在資料量小於20的時候,插入排序具有最好的效能。當大於20時,快速排序具有最好的效能,歸併(merge sort)和堆排序(heap sort)也望塵莫及,儘管複雜度都為nlog2(n)。
相關推薦
快速排序---簡解
快速排序是真的塊。 簡單的說一下快排的思想: 第一步,找出一個鍵值,通常取第一個元素,用temp中間變數暫存,left和right為排序範圍的左邊界和右邊界。 第二步、從右邊找出比temp小的放入i下標的位置。i++。 第三步、從i+1的位置往後找到比temp大的值放
高階排序-快速排序詳解
輔助工具 概述 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,
Java氣泡排序及快速排序詳解
氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
藍橋杯之快速排序詳解
快速排序排序在各種場合經常被用到。快速排序是十分常用的高效率的演算法。其思想是:先選一個“標尺”,用它把整個佇列過一遍篩子,以保證:其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。再分別對子區間排序就可以了。下面的程式碼是一種實現,請分析並
快速排序詳解C++
題目:將亂序陣列按從小到大排列。陣列中是允許出現重複數字的。 思路挺簡單: (1
php冒泡排序與快速排序實例詳解
lag ++ function 開始 ret light 記錄 php冒泡排序 php $a=array(‘3‘,‘8‘,‘1‘,‘4‘,‘11‘,‘7‘); print_r($a); $len = count($a); //從小到大 for($i=1;$i<$le
js實現快速排序,二分查詢 (詳解,一次學會)
js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩 一,快速排序 大致分三步: 在資料集之中,選擇一個元素作為"基準"(pivot)。 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 對"基準"左邊和右邊的兩個子集,不斷重複
幾種排序方法詳解(選擇排序、氣泡排序、插入排序、快速排序)
由於本帖只是闡述幾種排序方法的原理、如何區分以及編寫幾種排序的簡單程式碼,所以直接給定陣列是 a[ ]={6,2,8,5,1},需要把以上5個數字按升序排列 1. 選擇排序法 (如果不想看解釋分析,直接往後拉看程式碼) 實質: 第一輪:通過對比陣列中前一個元素和後一個元素
快速排序(Quicksort)詳解(動畫程式碼)
快速排序只一種基於分治策略(divide and conquer)的經典排序演算法,並且是一種原地(in-place)排序,實現原地排序的依據是用兩個陣列下標(start,end)來確定當前待排序子陣列的範圍。 切分(partition)步驟(關鍵): 在對子陣列進行排序時,本質上是在確定子
快速排序 java詳解
1.快速排序簡介: 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。 2.快速
3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分)
3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */
快速排序(Quicksort)詳解
快速排序只一種基於分治策略(divide and conquer)的經典排序演算法,並且是一種原地(in-place)排序,實現原地排序的依據是用兩個陣列下標(start,end)來確定當前待排序子陣列的範圍。 切分(partition)步驟(關鍵): 在對子陣列進行排序
Python四大流行排序演算法詳解--快速排序-氣泡排序-選擇排序-插入排序。
就作者而言使用Python經常用到的排序演算法就是快速排序、氣泡排序、選擇排序以及插入排序 就時間複雜度而言,快速排序是高階排序,查詢快速,時間複雜度為nlgn 而氣泡排序、選擇排序、插入排序則是比較低階的查詢演算法,時間複雜度為n**2 下面
快速排序演算法詳解(原理、實現和時間複雜度)
快速排序是對氣泡排序的一種改進,由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料比另一部分的所有資料要小,再按這種方法對這兩部分資料分別進行快速排
九種經典排序演算法詳解(氣泡排序,插入排序,選擇排序,快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序)
綜述 最近複習了各種排序演算法,記錄了一下學習總結和心得,希望對大家能有所幫助。本文介紹了氣泡排序、插入排序、選擇排序、快速排序、歸併排序、堆排序、計數排序、桶排序、基數排序9種經典的排序演算法。針對每種排序演算法分析了演算法的主要思路,每個演算法都附上了虛擬
O(n*logn)級別的演算法之二(快速排序)的三種實現方法詳解及其與歸併排序的對比
快速排序被稱為二十世紀演算法界的一大傑作 一,單路快排 1.測試用例: #ifndef INC_06_QUICK_SORT_DEAL_WITH_NEARLY_ORDERED_ARRAY_SORTTESTHELPER_H #define INC_06_QUICK_
八大排序演算法詳解——快速排序
基本思想 設當前待排序的陣列無序區為R[low..high],利用分治法可將快速排序的基本思想描述為: 分解: 在R[low..high]中任選一個記錄作為基準(Pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間R[low..pivotpos-1)和R[pivotpos+1..hig
二分查詢、快速排序對比和詳解
這兩個都是用到分治的思想很容易搞混。而且即使binarySearch是用到分治也不一定意味著一定要用遞迴去實現,可以通過迴圈實現。二分查詢和快速排序屬於面試筆試的高頻問題有必要總結一下。 由於迴圈相比遞迴少了很多記憶體分配和壓棧的操作開銷會少很多,所以
【排序】快速排序及其非遞迴實現,歸併排序詳解
快速排序 快速排序(Quicksort)是對氣泡排序的一種改進。 我們知道快速排序用的是分治的基本思想:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴的解決這些子問題,然後將這些子問題的解組合為原問題的解。 快速排序的基本思想是:
演算法精解----快速排序(方式1)
前言: 快速排序工作原理就是先在序列中找到一個基準值,我稱為K值。然後小於K的放在K的前面,大於K的放在K的後面。其實我們每操作K一次,就相當於把序列分為兩個部分,一部分大於K,一部分小於K,就這樣周