1. 程式人生 > >快速排序法(java 程式碼)

快速排序法(java 程式碼)

遞迴實現快速排序法: 
* 以一個值為基準值(通常第一個),把陣列分成兩部分: 前面部分的值都比基準值小, 後面部分的值都比基準值大.
* 1.每一次遞迴迴圈以第一個值為分界點,
* (1).先從後面開始檢索,值比基準值大就略過,比之小就把此值移到左邊指標位置
* (2).再從前面開始檢索,值比基準值小就略過,比之大就把此值移到當前的右指標位置
* 如果左指標比右指標小,繼續迴圈1和2,直到分界點左邊的值較小,右邊的之較大, 最後把基準值賦值給當前的左指標位置.
* 完成一次遞迴排序, 陣列被分割成兩個字子陣列
* 開始遞迴:

* 分別對前後兩個子陣列進行1過程,直至陣列被分割成若干個只有一個元素的子陣列,整個陣列快速排序完成.

實現程式碼:

package javax.util.demo;


import java.util.Arrays;


public class SortTest {


static int[] array = {7, 3, 6, 9, 2, 5, 8, 12, 23, 4, 1, 54};
public static void main(String[] args) {
System.out.println(Arrays.toString(array));
quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}


/**
* 遞迴實現快速排序法: 
* 以一個值為基準值(通常第一個),把陣列分成兩部分: 前面部分的值都比基準值小, 後面部分的值都比基準值大.
* 1.每一次遞迴迴圈以第一個值為分界點,
* (1).先從後面開始檢索,值比基準值大就略過,比之小就把此值移到左邊指標位置
* (2).再從前面開始檢索,值比基準值小就略過,比之大就把此值移到當前的右指標位置
* 如果左指標比右指標小,繼續迴圈1和2,直到分界點左邊的值較小,右邊的之較大, 最後把基準值賦值給當前的左指標位置.
* 完成一次遞迴排序, 陣列被分割成兩個字子陣列
* 開始遞迴:
* 分別對前後兩個子陣列進行1過程,直至陣列被分割成若干個只有一個元素的子陣列,整個陣列快速排序完成.
* @param array 需要排序的子陣列(第一次為原陣列)
* @param startIndex 開始指標
* @param endIndex 結束指標
*/
private static void quickSort(int[] array, int startIndex, int endIndex) {
if(startIndex >= endIndex) {
//遞迴結束點: 當左右相等或者左大於右時結束函式
//System.out.println("End same startIndex = " + startIndex + ", endIndex= " + endIndex);
return;
}
int boundary = boundary(array, startIndex, endIndex);
System.out.println(Arrays.toString(array) + " boundary = " + boundary);
//遞迴排序陣列前面部分子陣列,先完成前面部分排序
quickSort(array, startIndex, boundary - 1);

//遞迴後面部分的排序
quickSort(array, boundary + 1, endIndex);
}

/**
* 尋找分界點的標記下標
* 每一次以第一個為基準值,分界點後面部分中較小的值和前面部分中較大的值進行交換
* @param array
* @param startIndex
* @param endIndex
*/
private static int boundary(int[] array, int startIndex, int endIndex) {
int standard = array[startIndex];//取第一個值為基準值
int leftIndex = startIndex;//左邊界指標
int rightIndex = endIndex;//右邊界指標

//交換leftIndex和rightIndex的值
while(leftIndex < rightIndex) {
//從後面開始往前搜尋
while(leftIndex < rightIndex && array[rightIndex] >= standard) {
//當前值比基準值大就略過
rightIndex--;
}
//發現後面的值比基準值小,把這個值移到最前面的leftIndex位置,rightIndex的位置成為"空"
array[leftIndex] = array[rightIndex];
System.out.println(Arrays.toString(array) + " rightIndex = " + rightIndex + ", leftIndex= " + leftIndex);

//前面開始檢索
while(leftIndex < rightIndex && array[leftIndex] <= standard) {
//當前值比基準值小就略過
leftIndex++;
}
//發現前面的值比基準值大,就把這個值移到rightIndex位置, leftIndex的位置成為"空"
array[rightIndex] = array[leftIndex];
System.out.println(Arrays.toString(array) + " leftIndex = " + leftIndex + ", rightIndex= " + rightIndex);
}

//左邊的"空"位置賦值為基準值
array[leftIndex] = standard;
return leftIndex;
}
}

相關推薦

快速排序java 程式碼

遞迴實現快速排序法:  * 以一個值為基準值(通常第一個),把陣列分成兩部分: 前面部分的值都比基準值小, 後面部分的值都比基準值大. * 1.每一次遞迴迴圈以第一個值為分界點, * (1).先從後面開始檢索,值比基準值大就略過,比之小就把此值移到左邊指標位置 * (2).再

C語言實現快速排序分治法

下一個 enter hang partition 等於 就是 tor log markdown title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true ---

快速排序golang實現

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n

排序Java & C/C++ 實現

一、前言 堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 O(n * lg n)。 介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。 二、堆 1. 示意圖 2. 性質 除最底層外,該樹是完全充滿的,且是從左到右填充。 樹的根結點是 A[

希爾排序Shell Sort——插入排序Java實現

希爾排序法(Shell Sort)屬於插入類排序,又稱為縮小增量排序。它對直接插入排序有了很大的改進,是直接插入排序的增強版。 希爾排序的基本思想是: 把線性表按步長gap分組,共有gap個組。 每

快速排序QuickSortJava

快速排序 思想 如上圖:每趟快速排序開始時,設定一個key,key=array[low],然後由high向左,找到小於key的值,複製到low位置,然後再由low向右找到大於key的值,複製到high位置,直到low=high

插入排序Java實現

插入法排序 ※ 插入法排序原理 利用插入法對無序陣列排序時,我們其實是將陣列R劃分成兩個子區間R[1..i-1](已排好序的有序區)和R[i..n](當前未排序的部分,可稱無序區)。插入排序的基本操作是將當前無序區的第1個記錄R[i]插人到有序區R[1..i-1

一維搜尋方法/黃金分割附matlab程式碼

一維搜尋方法中的黃金分割法(附matlab程式碼) 一維搜尋方法:一維搜尋,又稱一維優化,是指求解一維目標函式 f(X) 最優解的過程,分為試探法和插值法。 黃金分割法:屬於一維搜尋方法中的試探法,適用於[a,b]區間上的任何單谷函式求極小值問題。 證明r=0.

直接插入排序C語言實現

插入法排序:通過資料移動,留出合適位置插入順序合適的值,而無須資料交換 步驟:從第二個元素“i”開始快取準備用於比較,並留出一個空位將空位前的元素“j”拿來與快取值比較不滿足則移動,直到向前找到頭比較的目的是要讓快取值插入後成為從開頭到插入點這個區間中的最值如果快取值向前看

主元素,中位數以及快速排序問題分治法問題

IBM最後有道求主元素的題目,一個數組有N個元素,其中有超過N/2的元素相同,請找出這個元素。時間複雜度為O(n) 方法1: 如果一個元素的個數超過N/2則這個元素必然是這N個元素的中位數。則這個題目是找中位數。方法是通過快速排序變化的來的演算法。 程式碼如下: #incl

PAT Basic 1045. 快速排序(25)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目著名的快速排序演算法裡有一個經典的劃分過程:我們通常採用某種方法取一個元素作為

程式設計師必會的十步快速學習附書單

![](https://images.cnblogs.com/cnblogs_com/binfun/1921791/o_210124095548p1.jpg) 本文對《軟技能:程式碼之外的生存指南》書中的“十步學習法”展開討論,該書作者是John Z. Sonmez,一名程式設計師,書中有很多面試、專業等建

Java常用的八種排序演算法與程式碼實現:歸併排序快速排序

注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort):   分而治之,遞迴實現   如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了   歸併排序是穩定的排序演算法,時間

排序java

emp ive public while href ava 指針 循環 lec 1. 冒泡算法2. 快速排序3. 歸並排序4. 選擇排序5. 堆排序 排序算法 重要性不言而喻,很多算法問題往往選擇一個好的排序算法往往問題可以迎刃而解 1、冒泡算法

【算拾遺java描寫敘述】--- 插入排序直接插入排序、希爾排序

ecan itblog insert med image java程序 can rip title 插入排序基本思想 每次將一個待排序的記錄按其keyword大小插入到前面已經拍好序的子文件的適當位置,直到全部記錄插入完畢為止。 直接插入

選擇數組排序參考Java

排序 pri str com system div ring ack emp package com.swift; public class Xuanze { public static void main(String[] args) { i

常見14種經典排序演算法Java程式碼實現

尊重原創,轉載請標明出處   http://blog.csdn.net/abcdef314159 ,想了解更多演算法題可以關注微信公眾號“資料結構和演算法”,每天一題為你精彩解答。 一,氣泡排序 排序演算法其實有很多,氣泡排序基本上算是最簡單的一種

java學習-排序及加密簽名時資料排序方式 十大經典排序演算法動圖演示 Java Comparator字元排序(數字、字母、中文混合排序) 編寫高質量程式碼:改善Java程式的151個建議(第5章:陣列和集合___建議70~74)

排序有兩種 1. 類實現comparable介面呼叫List.sort(null)或Collections.sort(List<T>)方法進行排序 jdk內建的基本型別包裝類等都實現了Comparablel介面,預設是使用自然排序,即升序排序 自定義類實現Comparable介面必須要實現c

六大經典排序演算法Java:冒泡、選擇、插入、希爾、快速、歸併

/** * @author Darren * @Date 2016-10-17 */ public class Main { public static void main(String[] args) { int[] ars = {

氣泡排序BubbleSort——交換類排序(java實現)

氣泡排序法 從陣列的第一個元素arr[0]開始,兩兩比較arr[0]與arr[0+1],如果前面的數大於後面的數(arr[i]>arr[i+1]),那麼交換兩個元素的位置,把大的數往後移動。這樣