圖解排序演算法(五)之快速排序
選取一個樞紐,使它左邊的值都比它小,右邊的值比它大。(假定選陣列第一個元素值)
int Partition(int* array, int low, int high) { int pivotkey; pivotkey = array[low]; while(low < high) { while(low < high && array[high] > pivotkey) high--; swap(array, low, high); while(low < high && array[low] < pivotkey); low++; swap(array, low, high); } return low; }
pivotkey不斷交換,low,high中必有一個是樞紐(low是樞紐時,比較high;當high是樞紐時比較low),從表的兩端交替向中間掃描。
劍指offer上的方法:
相關推薦
圖解排序演算法(五)之快速排序
選取一個樞紐,使它左邊的值都比它小,右邊的值比它大。(假定選陣列第一個元素值) int Partition(int* array, int low, int high) { int pivotkey; pivotkey = array[low];
資料結構之排序演算法(五)-直接插入排序,希爾排序,直接選擇排序
直接插入排序:時間複雜度:O(n^2) 基本演算法思路是:把後面待排序的記錄按其關鍵字的大小逐個插入到一個已經排好序的有序序列中,直到所有記錄插完為止,得到一個新的有序序列。(無序插入前面有序) 演算
排序演算法(五)、堆排序 —— 合併果子
2004年NOIP全國聯賽普及組 題目描述: 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,
八大排序演算法(五)——快速排序
快速排序可能是應用最廣泛的排序演算法。快速排序流行的原因是因為它實現簡單、適用於各種不同的輸入資料且在一般應用中比其他排序演算法都要快的多。快速排序的特點包括它是原地排序(只需要一個很小的輔助棧),且將長度為n的陣列排序所需的時間和nlogn成正比。快速排序的內迴圈比大多數排序演算法都要短小,這
排序演算法雜談(五) —— 關於快速排序的優化策略分析
1. 前提 2. 優化策略1:主元(Pivot)的選取 歸併排序(Merge Sort)有一個很大的優勢,就是每一次的遞迴都能夠將陣列平均二分,從而大大減少了總遞迴的次數。 而快速排序(Quick Sort)在這一點上就做的很不好。 快速排序是通過選擇一個主元,將整個陣列劃分(Partition)成
排序演算法(五)快速排序多種版本
快速排序 ,就像它的名稱一樣,是時間複雜度比較低的一種排序演算法。 我們知道,快速排序是通過分治的方法,將一個大的區間劃分成小區間(找一個樞紐,將大的數放置在樞紐的右邊,小的數放置在樞紐左
我的軟考之路(六)——資料結構與演算法(4)之八大排序
排序是程式設計的基礎,在程式中會經常使用,好的排序方法可以幫助你提高程式執行的效率,所以學好排序,打好基礎,對於程式的優化會手到擒來。無論你的技術多麼強,如果沒有基礎也強不到哪去。
排序(四)之快速排序
快速排序法 快速排序法相交之前的三種排序法來講,是一種執行速度較快的排序演算法,也是一種大家經常使用的排序演算法。 快速排序法使用一種分治的思想,將待排陣列切分成兩個子陣列,將兩個子陣列進行獨自的排序。 與歸併排序的區別 快速排序法與歸併排序不同,歸併排序是將兩個有序的
經典排序演算法(4)——折半插入排序演算法詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
排序演算法(3)--直接插入排序InsertSort
介紹: 插入排序的工作原理是,對於每個未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。 越有序越快 步驟: 1.從第一個元素開始,該元素可以認為已經被排序 2.取出下一個元素,在已經排序的元素序列中從後向前掃描 3.如果被掃描的元素(已排序)大於新元
java排序演算法(四)------希爾排序
希爾排序 希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破O(n2)的第一批演算法之一。 程式碼實現: /** *希爾排序的誕生是由於插入排序在處理大規模陣列的時候會遇到需要移動太多元素的問
java排序演算法(八)------桶式排序
桶式排序 實現程式碼: /** *桶式排序:有限個數字m,每個數字的大小都在1與n之間 *,則我們可以假設有n個桶,遍歷m個數字,將其存入對應的桶中 *(如數字的值為3,就存入3號桶,桶的值對應存入數字的個數) */ public class Bucke
排序演算法(四)、選擇排序 —— 簡單選擇排序 和 堆排序
1、簡單選擇排序簡單選擇排序思想是:從頭到尾(從後往前也行)遍歷序列,先固定第一個位置的資料,將該位置後面的資料,依次和這個位置的資料進行比較,如果比固定位置的資料大,就交換。這樣,進行一趟排序以後,第一個位置就是最小的數了。然後重複進行,第 2 次遍歷並且比較後,第二個位置
排序演算法(六)、歸併排序
1、二路歸併排序“歸併”即“合併”,是指將兩個或者兩個以上有序表組合成一個有序表。假如待排序表含有 n 個記錄,即可以視為 n 個有序的子表。每個子表長度為1,然後兩兩歸併,得到 n/2 個長度為 2 或者 1 的有序表,然後,再兩兩歸併,。。。。如此重複,直到合併成一個長度
經典排序演算法(6)——直接選擇排序演算法詳解
直接選擇排序(Straight Select Sort)是一種典型的選擇排序演算法,通過不斷選擇序列中最大(小)的元素。 一、演算法基本思想 (1)基本思想 直接選擇排序的基本思想就
排序演算法(1):氣泡排序和插入排序
1.1 氣泡排序 氣泡排序需要多次遍歷列表。它比較相鄰的項並交換那些無序的項。每次遍歷列表將下一個最大的值放在其正確的位置。實質上,每個項“冒泡”到它所屬的位置。 用python寫交換操作時,與大多數程式語言略有不同(需要臨時儲存位置),python可以執行
排序演算法(5)- 折半插入排序(Binary Insertion Sort)
原理 插入排序演算法的優化演算法 排序演算法是和已排序佇列按順序一一比較,然後交換位置,直到找出插入位置。折半插入排序演算法是先適用折半查詢找出插入位置,然後統一後移。 注意點 時間複
排序演算法(六)非比較排序----計數排序和基數排序
前邊的幾篇文章介紹的幾種排序演算法都是比較排序,接下來的文章將會介紹兩種非比較排序。 計數排序: 計數排序通過雜湊的方法將一組資料對映到一個數組裡,最後將陣列中的數依次讀取,並寫進原來的陣列,讀出的資
排序演算法(三):計數排序與桶排序
插入排序、堆排序、歸併排序等排序方法,在排序的最終結果中,各個元素的次序依賴於他們之間的比較,我們把這一類的排序演算法稱為比較排序。在最壞情況下,任何比較排序演算法都要經過 Omega(nlgn)次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。
八大排序演算法(3) 簡單選擇排序
基本思路 每次選出剩餘序列中最小/最大的數、與剩餘序列的第一個交換位置。 示例: // 升序,左起 /*初始值*/ 10, 7, 1, 8, 5, 12, 6, 3, 9 /*第1趟*