快速排序詳細分析(Java實現)

2021-09-12 14:28:34 字數 1762 閱讀 2611

/**

* 排序過程

* 1,找乙個基準數,找陣列內的任意乙個數都行,一般都是以陣列第乙個數為基準數

* 2,從陣列末位向前迴圈找比基準數小的,找到了先停下,也就是記錄當前的索引

*   從陣列開端向後迴圈找比基準數大的,找到了先停下,也就是記錄當前的索引

* 3,將第二步的兩個索引的位置的數值交換,這樣比基準數大的就到了基準數的後面, 比基準數小的就到了基準數的前面

* 4,繼續不停的重複2,3步,直到兩個索引位置相等,就不用再交換了,也就是當start < end時就不停止迴圈

* 5,start和end相等,停止迴圈,將start或end位置的數與基準數交換

* 6,遞迴迴圈基準數左面的陣列

* 7,遞迴迴圈基準數右面的陣列

* @param arr

* @param start

* @param end

** 幾個問題,(把索引start和end當成指標來講)

* start和end一定會相遇嗎,或者說start和end一定會相等嗎?

*      答:一定會的,因為start和end都是一步一步移動的,移動會發生重合

* start和end相遇或者說重合或者說索引位置一樣,該位置的數一定是比基準數小的嗎?(該位置的數要和基準是交換)

*      答:因為是end先移動的,end指向的都是比比基準數小的數(start和end交換時)

*      1當end發現比基準數小的數,start發現比基準數大的數,進行交換資料時,一定是成對出現的

*      2當end往前移動與start相遇時,這個時候start和end已經交換了資料,start指向的就是比基準數小的數,

*      3當start向後移動,end已經指向的是比基準數小的數,

*      4綜上;當相遇時start和end位置上的數一定是比基準數小的數,所以可以和首位置上的基準數交換

*      5出現「相遇時start和end位置上的數一定是比基準數小的數」這種情況是移動的先後順序引起的,如果是start

*          先移動,則相遇時最後指向的是比基準數大的數。

*/

public static void fastsort(int arr,int start,int end)

//將基準數和start與end相等的位置的數交換位置,left位置就是最開端的數,是基準數

//這個時候start和end是相等的,這裡用end也可以

swap(arr,left,start);

//基準數左側陣列的排序

fastsort(arr,left,start-1);

//右側的排序

fastsort(arr,start+1,right);

}hello world

輸出:6,7,9,30,34,34,42,48,49,83,84,89,93,98,223,321,845,

public static void swap(int arr,int index1,int index2)

public static void main(string args);

fastsort(arr,0,arr.length-1);

// swap(arr,0,2);

printarr(arr);

}private static void printarr(int arr)

system.out.println(stringbuilder.tostring());

}

歸併排序詳細分析

通過定義兩個儲存空間,第乙個儲存空間為使用者輸入的陣列段。在第乙個儲存空間中每次分組比較,然後將結果排入第二個儲存空間中。週期結束後兩個儲存空間交換。從菜鳥教程學習的這個演算法,菜鳥教程中歸併排序有兩個實現方法 乙個是迭代,乙個是遞迴。這裡我主要針對迭代分析。void merge sort int ...

快速排序 的 尾遞迴優化 詳細分析

void qsort int arr,int low,int high 尾遞迴詳細介紹 尾遞迴概念 如果乙個函式中所有遞迴形式的呼叫都出現在函式的末尾,當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。尾遞迴函式的特點是在回歸過程中不用做任何操作,這個...

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...