1. 程式人生 > >快速排序(Quicktsort)之Java實現

快速排序(Quicktsort)之Java實現

快速排序演算法介紹

快速排序和歸併排序都使用分治法來設計演算法,區別在於歸併排序把陣列分為兩個基本等長的子陣列,分別排好序之後還要進行歸併(Merge)操作,而快速排序拆分子陣列的時候顯得更有藝術,取一個基準元素拆分之後基準元素左邊的元素都比基準元素小,右邊的元素都不小於基準元素,這樣只需要分別對兩個子陣列排序即可,不再像歸併排序一樣需要歸併操作。基準元素的選取對演算法的效率影響很大,最好的情況是兩個子陣列大小基本相當。為簡單起見,我們選擇最後一個元素,更高階的做法可以先找一箇中位數並把中位數與最後一個元素交換,之後再進行相同的操作步驟。拆分是快速排序的核心。快速排序的最壞執行時間是O(n2

),但期望的執行時間是O(nlgn)。

快速排序演算法Java實現

  1. 把陣列拆分為兩個子陣列加上一個基準元素: 選取最後一個元素作為基準元素,index變數記錄最近一個小於基準元素的元素所在的位置,初始化為start- 1,發現新的小於基準元素的元素,index加1。從第一個元素到倒數第二個元素,依次與基準元素比較,小於基準元素,index加1,交換位置index和當前位置的元素。迴圈結束之後index+1得到基準元素應該在的位置,交換index+1和最後一個元素。
  2. 分別排序[start, index], 和[index+2, end]兩個子陣列

如《插入排序(Insertsort)之Java實現》一樣,先實現一個數組工具類。程式碼如下:

public class ArrayUtils {
	
	    public static void printArray(int[] array) {
		    System.out.print("{");
		    for (int i = 0; i < array.length; i++) {
			    System.out.print(array[i]);
			    if (i < array.length - 1) {
				    System.out.print(", ");
			    }
		    }
		    System.out.println("}");
	    }

	    public static void exchangeElements(int[] array, int index1, int index2) {
		    int temp = array[index1];
		    array[index1] = array[index2];
		    array[index2] = temp;
	    }
    }

快速排序的Java實現以及測試程式碼如下:

 public class QuickSort {

		public static void main(String[] args) {
			int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };

			System.out.println("Before sort:");
			ArrayUtils.printArray(array);

			quickSort(array);

			System.out.println("After sort:");
			ArrayUtils.printArray(array);
		}

		public static void quickSort(int[] array) {
			subQuickSort(array, 0, array.length - 1);
		}

		private static void subQuickSort(int[] array, int start, int end) {
			if (array == null || (end - start + 1) < 2) {
				return;
			}

			int part = partition(array, start, end);

			if (part == start) {
				subQuickSort(array, part + 1, end);
			} else if (part == end) {
				subQuickSort(array, start, part - 1);
			} else {
				subQuickSort(array, start, part - 1);
				subQuickSort(array, part + 1, end);
			}
		}

		private static int partition(int[] array, int start, int end) {
			int value = array[end];
			int index = start - 1;

			for (int i = start; i < end; i++) {
				if (array[i] < value) {
					index++;
					if (index != i) {
						ArrayUtils.exchangeElements(array, index, i);
					}
				}
			}

			if ((index + 1) != end) {
				ArrayUtils.exchangeElements(array, index + 1, end);
			}

			return index + 1;
		}
	}


相關推薦

快速排序(Quicktsort)Java實現

快速排序演算法介紹 快速排序和歸併排序都使用分治法來設計演算法,區別在於歸併排序把陣列分為兩個基本等長的子陣列,分別排好序之後還要進行歸併(Merge)操作,而快速排序拆分子陣列的時候顯得更有藝術,取一個基準元素,拆分之後基準元素左邊的元素都比基準元素小,右邊的元素都不小於

快速排序算法 java實現

基準 ++ code 大於 java oid 序號 while 算法 1 public class QuickRank { 2 public static void main(String[] args) { 3 int[] original={26,58,

歸併排序(Mergesort)Java實現

歸併排序演算法介紹 歸併排序是一個分治演算法(Divide and Conquer)的一個典型例項,把一個數組分為兩個大小相近(最多差一個)的子陣列,分別把子陣列都排好序之後通過歸併(Merge)手法合成一個大的排好序的陣列,歸併的過程依然用撲克來解釋,想象一下桌子上有兩堆

快速排序原理及java實現

快速排序是對氣泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一不部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。最壞情況的時間複雜度為O(

拓撲排序(Topologicalsort)Java實現

拓撲排序演算法介紹 拓撲排序解決的是一系列相互依賴的事件的排序問題,比如Ant中有很多的Task,而某些Task依賴於另外的Task,編譯之前需要清理空間,打包之前要先編譯,但其它一些Task處理順序可以調換(是無所謂前後,不是並行), 如何安排Task的執行順序就可以用拓

計數排序(Countsort)Java實現

計數排序演算法介紹 比較排序演算法可以通過決策樹模型證明,其下線是O(nlgn)。而本文介紹的是時間效率為O(n)的計數排序。所謂排序演算法,無非就是把正確的元素放到正確的位置,計數排序就是計算相同key的元素各有多少個,然後根據出現的次數累加而獲得最終的位置資訊。但是計數

排序演算法】快速排序原理及Java實現

1、基本思想: 快速排序是我們之前學習的氣泡排序的升級,他們都屬於交換類排序,都是採用不斷的比較和移動來實現排序的。快速排序是一種非常高效的排序演算法,它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到後面,關鍵字較小的記錄從後面直接移

插入排序(Insertsort)Java實現

插入排序演算法介紹 排序演算法是最簡單的演算法,也是最基本的演算法。顧名思義,插入排序就是把當前待排序的元素插入到一個已經排好序的列表裡面。 一個非常形象的例子就是右手抓取一張撲克牌,並把它插入左手拿著的排好序的撲克裡面。插入排序的最壞執行時間是O(n2), 所以並不是最優

排序(Heapsort)Java實現

堆排序演算法介紹 堆是一種重要的資料結構,為一棵完全二叉樹, 底層如果用陣列儲存資料的話,假設某個元素為序號為i(Java陣列從0開始,i為0到n-1),如果它有左子樹,那麼左子樹的位置是2i+1,如果有右子樹,右子樹的位置是2i+2,如果有父節點,父節點的位置是(n-1)

快速排序——Java實現

bubuko border div title pan ring itl float width 一、排序思想 快速排序是由冒泡排序改進而得到的,是一種分區交換排序方法。思想如下:一趟快速排序采用從兩頭向中間掃描的方法,同時交換與基準記錄逆序的記錄。在待排序的N個

快速排序java實現

star sta arrays -- 發現 作者 沒有 span array 據說一般的筆試或面試都會考考排序,今天就試著想自己實現一把,看了原理後,發現沒那麽容易,又去網上找了下,發現評論都說作者的代碼有問題。這更激起了我的興趣。 遂堅持編寫出來並進行了測試,應該沒有問題

八大排序快速排序算法-python實現

com 現在 主函數 port 右移 們的 冒泡 實現 odin 快排就是折中時間和空間的一個算法,可以說是較為高效的算法,平時用用他沒啥大問題。 自己也看到個比較形象生動的例子,為了讓大家能夠看的比較清楚,我就直接轉過來給大家看了哈!但是我使用python實現的: 註意以

排序演算法插入排序演算法【java實現

插入排序演算法通過對未排序的資料執行逐個插入至合適的位置而完成排序工作。思路簡單,應用較多。但是此演算法在資料無規律的情況下,需要移動大量的資料,效率不高。 步驟: (1)首先對陣列的前兩個資料進行從小到大排序。 (2)接著將第3個數據與排好序的兩個資料進行比較,將第3個數據插入合適的位

排序演算法選擇排序演算法【java實現

簡介:遍歷陣列,每次選出最小的數與索引第一個進行交換,直到全部完成。 package zhgyu.sort; /** /*選擇排序演算法 * @author zhgyu * */ public class SelectionSort { static final int SIZE =

希爾排序Java實現

希爾排序思想: 希爾排序其實就是將一個數組分段進行插入排序,最後再將分段序列組合在一起進行大的插入排序。 也即:希爾排序是首先將陣列分成若干子陣列(一般子陣列的個數是n/2或者n/m,n是陣列長度,m是分隔間距),然後每個子陣列進行插入排序;再縮減增量(一般縮減增量表達式是

必須知道的八大種排序演算法【java實現】(一) 氣泡排序快速排序

氣泡排序   氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。   氣泡排序的示例:   氣

Java小程式Java實現快速電腦程式啟動

一、前言        平時我們啟動電腦桌面的應用程式一般是雙擊桌面的圖示;        想不同尋常,或者在其他不懂電腦的人面前裝一下逼,那麼你就往下看吧!        使用Windows鍵+R鍵開啟執行對話方塊                          在對

七大排序演算法(冒泡,選擇,插入,二分法排序,希爾,快速,合併,堆排序)的java實現(14/8/3更新加入二分排序

氣泡排序 思路:就是每次將最大或最小的元素放到陣列的最後,so easy!時間複雜度為(O(n^2)) public class BubbleSort { public static void bubbleSort(int[] a) { for (int j = 1;

資料結構排序演算法快速排序(c語言實現

快排的原理就是通過一趟排序將待排記錄分割成獨立的兩部分,其中的一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。這其中,可以使用遞迴呼叫某一關鍵函式的辦法來實現這樣的功能。 分割的方法就是,選取一個樞軸,將所有關鍵字比它

演算法(第四版)學習筆記java實現插入排序

插入排序:插入排序是在遍歷元素的過程中,當前索引左邊的所有元素都是有序的,但最終位置是不確定的;當前索引右邊的所有元素都是待排序的,而排序的過程就是逐漸將索引右邊的無序的元素按照自己制定的排序規則插入