// 快速排序
public
class
quicksort
;// int arr = ;
// 測試時間複雜度 o(n^2)
/* int arr = new int[80000];
for (int i = 0; i < arr.length; i++)
*/long start_time = system.
currenttimemillis()
;quicksort
(arr,
0,arr.length-1)
;long stop_time = system.
currenttimemillis()
;// 毫秒之間
system.out.
printf
("耗費 %d ms"
,stop_time - start_time)
; system.out.
println
(arrays.
tostring
(arr));
}public
static
void
quicksort
(int
arr,
int left,
int right)
// 在 pivot 的右邊一直找 ,找到小於等於pivot 值,才退出
while
(arr[rightindex]
> pivot)
/** * 如果 leftindex >= rightindex 說明 pivot 的左右的值 ,已經按照左邊的全部
* 是小於pivot 值,右邊全部是大於等於pivot的值 退出迴圈
*/if(leftindex == rightindex)
// 如果不等於退出條件就是找到了相應的值 進行交換
temp = arr[leftindex]
; arr [leftindex]
= arr[rightindex]
; arr [rightindex]
= temp;
/** * 交換完成後 有三種情況
* 1、左邊的leftindex 已經移動到中間點 但是 右邊的rightindex還沒有移動到中間點 所以右邊的需要後退一步 繼續判斷迴圈
* 2、右邊的rightindex 已經移動到中間點 但是 左邊的leftindex還沒有移動到中間點,需要前移 繼續迴圈
* 3、就是兩邊都沒有移動到中間點 繼續迴圈判斷
* 這裡的判斷可以不寫 這裡判斷的目的是減少迴圈的次數
*/if(arr[leftindex]
== pivot)
if(arr[rightindex]
== pivot)
}// 這裡既是防止死迴圈(棧溢位)的同時也是劃分左遞迴 和 右遞迴 開始和結束的區域
if(leftindex == rightindex)
// 左遞迴 對左邊的區域進行排序
if(left < rightindex)
//右遞迴 對右邊的區域進行排序
if(right > leftindex)
}}
八大排序之快速排序
思想 定義陣列中的第乙個數為標誌量,再定義兩個指標,乙個指標從右向左開始遍歷陣列,直到找到乙個數比標誌量小 另乙個指標再從左向右遍歷陣列,直到找到乙個數比標誌量大。若找到,則交換這兩個數的位置,然後重複上述過程。直到兩個指標相遇時,交換此時指標指向的數的位置與標誌量的位置。此時,標誌量左邊的數均小於...
八大排序(三) 快速排序
快速排序的基本思想如下 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算...
八大排序(五)快速排序
快速排序使用了分治策略。一 選定乙個基準數 一般選取第乙個數 然後把大於它的數都放在它右邊,把小於它的數放左邊。二 這樣就把陣列分成左右兩部分。再將左右兩部分分別遞迴執行第一步,最終當執行第一步的部分大小為一時,遞迴完成,原陣列排序完成。public class quicksort 將剛剛找到的數插...