Java排序演算法之--快速演算法--快速上手
何為快速演算法:它是氣泡排序的改進~
基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
演算法的整個處理過程如下:
核心思想:基準數不斷不斷歸位的過程(右邊大於基準數,左邊小於基準數):
當基準數為左邊第一個數時,(從右邊向左開始掃描,當掃描到小於基準數的時候,暫停掃描,此時陣列下標為j
輪到左邊往右邊掃描,當掃描到大於基準數的時候,暫停掃描,此時陣列下標為i,交換i與j下標的數值),繼續“()”的步驟。
什麼時候截止呢?當i=j時,將基準數base與i所指的數交換,然後不斷的迭代這個過程。
當基準數為左邊第一個數時,(從右邊向左開始掃描,當掃描到小於基準數的時候,暫停掃描,此時陣列下標為j
輪到左邊往右邊掃描,當掃描到大於基準數的時候,暫停掃描,此時陣列下標為i,交換i與j下標的數值),繼續“()”的步驟。
什麼時候截止呢?當i=j時,將基準數base與i所指的數交換,然後不斷的迭代這個過程。
演算法實現如下:
- public static void quickSort(int [] a, int left, int right) {
- int i, j, t, base;
- if (left > right)
- return;
- base = a[left]; // base中存的就是基準數
- i = left; // 設定左右兩個引數
- j = right;
- while (i != j) {
- //要先從右邊開始找
- while (a[j] >= base && i <j)
- j--;
- // 再找左邊的
- while (a[i] <= base && i <j)
- i++;
- // 交換兩個數在陣列中的位置
- if (i <j) {
- t = a[i];
- a[i] = a[j];
- a[j] = t;
- }
- }
- // 最終將基準數歸位
- a[left] = a[i];
- a[i] = base;
- quickSort(a, left, i - 1);// 繼續處理左邊的,這裡是一個遞迴的過程
- quickSort(a, i + 1, right);// 繼續處理右邊的 ,這裡是一個遞迴的過程
- }
相關推薦
O(n*logn)級別的演算法之二(快速排序)的三種實現方法詳解及其與歸併排序的對比
快速排序被稱為二十世紀演算法界的一大傑作 一,單路快排 1.測試用例: #ifndef INC_06_QUICK_SORT_DEAL_WITH_NEARLY_ORDERED_ARRAY_SORTTESTHELPER_H #define INC_06_QUICK_
Java單元測試之JUnit 5快速上手
前言 單元測試是軟體開發中必不可少的一環,但是在平常開發中往往因為專案週期緊,工作量大而被選擇忽略,這樣往往導致軟體問題層出不窮。線上出現的不少問題其實在有單元測試的情況下就可以及時發現和處理,因此培養自己在日常開發中寫單元測試的能力是很有必要的。無論是對自己的編碼能力的提高,還是專案質量的提升,都是大有好處
二叉排序樹之查詢演算法
1.二叉排序樹的定義與描述 二叉排序樹又稱為二叉查詢樹,它是一種特殊的二叉樹。 定義:二叉排序樹是一顆空樹或者是具有一下性質的二叉樹。 1)若它的左子樹非空,則左子樹上所有的結點值均小於根結點的值。 2)若它的右子樹非空,則右子樹上所有的結點的值均大於(或等於)根結點的值。 3)它的左右子
Java併發程式設計之CAS演算法
在多執行緒環境下,我們要實現對一個變數自增的話,往往會使用java.util.concurrent.atomic包下的相關實現類。 如下: public class TestAtomic { public static void main(String
STL演算法之heap演算法,已排序區間演算法
// 1. sort() 將區間元素以謂詞方式排序 // 2. stable_sort() sort()並保持區間元素的穩定性 // 3. partial_sort() 以謂詞找到前[beg,mid) // 4. partial_sort_copy() 將
(基於Java)演算法之貪心演算法——活動安排問題
貪心演算法(Greedy Algorithm):又名貪婪演算法。貪心演算法是指,在對問題求解時,總是做出在當期看來是最好的選擇。也就是說,貪心演算法能決定出最好的下一步,它不是從整體最優上考慮,而僅僅是在某種意義上的區域性最優解。 值得注意的是:在某些問題上,用貪心演算法
java垃圾回收之複製演算法
之前的java垃圾回收演算法之-標記清除 會導致記憶體碎片。下文的介紹的coping演算法可以解決記憶體碎片問題。概述如果jvm使用了coping演算法,一開始就會將可用記憶體分為兩塊,from域和to域, 每次只是使用from域,to域則空閒著。當from域記憶體不夠了,開
五分鐘學演算法之經典演算法題 :排序演算法(某東演算法工程師比賽)
題目描述 已知資料表 A 中每個元素距其最終位置 不遠 ,為了節省時間,應該採取的演算法是() A、直接選擇排序 B、直接插入排序 C、堆排序 D、快速排序 題目分析 我們在之前學習 希爾排序 演算法的時候提及到,希爾排序進行到一定階段(每個元素距離其最終位置不遠時)一般都使用 插入排序 來收尾。 如果知
聚類演算法之DBSCAN演算法之二:高維資料剪枝應用NQ-DBSCAN
一、經典DBSCAN的不足 1.由於“維度災難”問題,應用高維資料效果不佳 2.執行時間在尋找每個點的最近鄰和密度計算,複雜度是O(n2)。當d>=3時,由於BCP等數學問題出現,時間複雜度會急劇上升到Ω(n的四分之三次方)。 二、DBSCAN在高維資料的改進 目前的研究有
聚類演算法之DBSCAN演算法之一:經典DBSCAN
DBSCAN是基於密度空間的聚類演算法,與KMeans演算法不同,它不需要確定聚類的數量,而是基於資料推測聚類的數目,它能夠針對任意形狀產生聚類。 1.epsilon-neighborhood epsoiln-neighborhood(簡稱e-nbhd)可理解為密度空間,表示半徑為e
WF曲速未來:區塊鏈核心演算法之Paxos演算法
Paxos演算法解決的問題是在一個可能發生訊息可能會延遲、丟失、重複的分散式系統中如何就某個值達成一致,保證不論發生以上任何異常,都不會破壞決議的一致性。 先帶你會看一下libpaxos3的程式碼: 第一步獲取和編譯LibPaxos3所需的基本步驟: 執行示例  
資料探勘演算法之K_means演算法
轉載地址:https://blog.csdn.net/baimafujinji/article/details/50570824 聚類是將相似物件歸到同一個簇中的方法,這有點像全自動分類。簇內的物件越相似,聚類的效果越好。支援向量機、神經網路所討論的分類問題都是有監督的學習方式
連結分析演算法之 HITS演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
python 資料結構與演算法之歸併演算法
def merge_sort(alist): n=len(alist) if n<=1: return alist mid=n//2 left_list =merge_sort(alist[:mid]) right_list =mer
字串匹配演算法之KMP演算法詳情
package demo; /* 字串匹配演算法 */ public class StringKMP { //找出從第一個字元開始 子串T在主串S的第一個位置 如果沒有則返回-1 public static int index(String S, String T)
大資料探勘領域十大經典演算法之—CART演算法(附程式碼)
簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,
最小生成樹演算法之Kruskal演算法
最近做大題目主要運用的都是資料結構方面的題,既有之前的最短路徑的相關的演算法,也有現在的最小生成樹,這裡先講解Kruskal演算法,主要是我先在剛會這個,prim演算法,明天再看。 Kruskal演算法演算法其實和之前的djs演算法有點類似,主要還是每次迴圈找出
資料探勘領域十大經典演算法之—SVM演算法(超詳細附程式碼)
簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及迴歸分析。 相關概念 分類器:分類器就是給定一個樣本的資料,判定這個樣本屬於哪個類別的演算法。例如在股
(3)聚類演算法之DBSCAN演算法
文章目錄 1.引言 2.`DBSCAN`相關定義 3.`DBSCAN`密度聚類思想 3.1 `DBSCAN`演算法定義 3.2 DBSCAN演算法流程 4.`DBSCAN`演算法實現 4.1 使用`n
資料探勘十大經典演算法之KNN演算法
KNN演算法(監督性學習) 1.演算法思想 KNN是通過測量不同特徵值之間的距離進行分類。它的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,其