快速排序及其優化
快速排序及其優化
快速排序:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
時間複雜度:平均情況O(nlogn) 最好情況O(nlogn) 最壞情況O(n^2)
空間複雜度:O(logn)
不穩定
程式碼:
優化1的直接插入函式InsertSort程式碼:
優化2的三數取中法GetMiddleNumber函式程式碼:
優化3:防止最壞情況,加入隨機函式,隨機取基準值
優化4:重複資料的處理,每次將與基準值相同的值放在基準值的周圍,不參與遞迴分組
優化5:非遞迴優化,利用棧的應用,重複進行壓棧Push操作 和 出棧Pop操作
最終將全部資料全部排序完成
相關推薦
快速排序及其優化
快速排序及其優化 快速排序:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。 時間複雜度:平均情況O(nlogn) 最好情
經典排序演算法——快速排序及其優化
快速排序快速排序的思想:通過一趟排序將資料分割成獨立的兩部分,其中一部分資料都比另一部分的所有資料都要小,然後再按照此方法對這兩部分資料分別進行快速排序,可以遞迴的進行。時間複雜度:好的情況(無序的):O(nlog2n)壞的情況(有序的):O(n^2) 快速排序法不穩定。讓我
三種快速排序以及快速排序的優化
效率 part 函數的參數 隨機數組 英文 turn 很難 pre 函數 我們在上一篇已經談到了快速排序的基本理解,見http://www.cnblogs.com/curo0119/p/8588565.html,接下來我們來更深入的了解一下快排的優化。 1、快速排序的基本思
O(n*logn)級別的演算法之一(歸併排序及其優化)
原理: 設兩個有序的子序列(相當於輸入序列)放在同一序列中相鄰的位置上:array[low..m],array[m + 1..high],先將它們合併到一個區域性的暫存序列 temp (相當於輸出序列)中,待合併完成後將 temp 複製回 array[low..high]中,從而完成排序。 在具體的合併過
快速排序的優化
三種快速排序以及快速排序的優化: 一:快速排序的基本思想 快排使用分治的思想: 通過一趟排序將待排序序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 二:
Java學習第14天—陣列高階應用—比較排序及其優化
比較排序 比較排序:compare(選擇排序:select) 原理:依次拿某個位置上的元素和其後的所有元素比較,大的放後邊,每次確定的就是此位置上的元素.比較的趟數是元素個數減1 package com.nim.sort; /* * 比較排序及其優化 */ pu
排序演算法雜談(五) —— 關於快速排序的優化策略分析
1. 前提 2. 優化策略1:主元(Pivot)的選取 歸併排序(Merge Sort)有一個很大的優勢,就是每一次的遞迴都能夠將陣列平均二分,從而大大減少了總遞迴的次數。 而快速排序(Quick Sort)在這一點上就做的很不好。 快速排序是通過選擇一個主元,將整個陣列劃分(Partition)成
《演算法導論》7.4-5:用插入排序對快速排序進行優化
當陣列幾乎有序時,插入排序很快。當快速排序分割到一定小的模組後再對整個陣列進行插入排序,來實現對快速排序的優化。確定分割到多大時再進行插入排序合適? #include<stdio.h> #include<stdlib.h> #include&l
希爾排序及其優化方案
希爾排序 基本思路 執行軌跡 程式碼實現 效能分析 優化方案 1、基本思路 什麼希爾排序? 一種基於插入排序的快速的排序演算法。 希爾排序為了加快速度簡單的改進了插入排序,交換不相鄰的元素 以對陣列的區域性進行排序,並最終用插入排序將區域性有
【轉】三種快速排序演算法以及快速排序的優化
一. 快速排序的基本思想 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 二. 快速排序的三個步驟 1) 選擇基準:在待排序列中,按照某種方式挑出一個元素,作為 “基準”(p
資料結構圖文解析之:直接插入排序及其優化(二分插入排序)解析及C++實現
0. 資料結構圖文解析系列 1. 插入排序簡介 插入排序是一種簡單直觀的排序演算法,它也是基於比較的排序演算法。它的工作原理是通過不斷擴張有序序列的範圍,對於未排序的資料,在已排序中從後向前掃描,找到相應的位置並插入。插入排序在實現上通常採用就地排序,因而空間複雜度為O(1)。在從後向前掃描的過程中,需要反
排序演算法之氣泡排序及其優化
定義:每一趟都是相鄰兩個元素進行比較,將小數放在前面,大數放在後面,最終一趟走完,最大的數也就跑到最後面了。 氣泡排序是常見的一種排序方法,比較簡單,容易理解,多用於教學(>﹏<) 最壞情況下時間複雜度:O(N^2) 。 比較次數是n(n-1)/2。 注
快速排序及快速排序的優化(完整版)
快速排序的的基本思想: 設陣列a中存放了n個數據元素,low為陣列的低端下標,high為陣列的高階下標,從陣列a中任取一個 元素(通常選取a[ow])作為標準,調整陣列a中各個元素的位置,使排在標準元素前面的元素的關鍵字均小於標準元素的關鍵字,排在標準元素後面元素的
排序演算法(四)氣泡排序及其優化
基本思路: 氣泡排序的基本思路是通過元素的兩兩比較不斷將較大值(升序)或則較小值(降序)移動序列的後面,類似於氣泡向上冒的排序演算法。 1、比較相鄰兩個元素大小,如若不符合要求則交換元素; 2、對整個序列做同樣1的操作,最後的元素一定是當前比較的序
快速排序 及其時間複雜度和空間複雜度
快速排序是排序演算法中效率相對較高的,但使用的人卻是比較少,大家一般信手拈來的排序演算法就是氣泡排序。因為氣泡排序主觀,容易理解,而快速排序使用到了遞迴,大家可能就有點不知所措了。 演算法分析 快速排序由C. A. R. Hoare在1962年提出。
java中快速排序的優化
接上節講的快速排序,我們來了解一下幾種它的優化。1.隨機取基準 上節我們採取的是以開頭為基準,然後進行一次快速排序,但是如果原陣列相對有序的話,那麼就會出現每次找基準,原陣列順序不變,時間複雜度相當的高,為了處理這種情況我們採用隨機選取基準,就是 public stat
快速排序及其改進
快速排序的平均時間複雜度為O(N logN),空間複雜度O(logN)。在待排序的陣列正好是正序或逆序時,時間空間複雜度為O(n^2),達到最快時間複雜度。1.傳統快速排序1.荷蘭國旗問題及三向切分將小於num的數放在左邊,大於num放在右邊,等於num放在中間3.隨機快速排
排序演算法之快速排序以及優化
顧名思義,就是一種速度特別快的快速排序也叫分割槽排序,是目前應用最廣泛的排序演算法,人如其名,就是很快,而且快速排序演算法在空間上只使用一個小的輔助棧,其內部迴圈也很小,另外快排很容易實現,消耗的資源也很小。 【基本思想】 (1)任取待排序元素序列中的某個元素(例如取第一
【排序】快速排序及其非遞迴實現,歸併排序詳解
快速排序 快速排序(Quicksort)是對氣泡排序的一種改進。 我們知道快速排序用的是分治的基本思想:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴的解決這些子問題,然後將這些子問題的解組合為原問題的解。 快速排序的基本思想是:
順序表上實現氣泡排序及其優化
氣泡排序 (1)定義順序表的儲存結構; (2)在順序表上實現氣泡排序; (3)將普通的氣泡排序進行多次改進以提高排序速度,並用大量資料測試其速度的提高。 1.普通版: 2.第一步優化:若在一次排序中沒有發生交換,說明此時已經全部有序無需再進行掃描 增加一個標記,記錄是否進