八大排序之快速排序

2021-10-04 20:35:52 字數 1688 閱讀 6267

// 快速排序

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 將剛剛找到的數插...