快速排序的三種實現方式

2021-10-10 11:25:04 字數 2839 閱讀 1533

隨機選取乙個基數(一般是陣列的第乙個)---->(小技巧:可以在陣列中隨機取乙個元素換到首位作為基準元素)

進行排序,把小於基數的放到左邊,大於基數的放到右邊;

分別對基數的左、右部分重新進行步驟2,直到陣列有序。

由上面的步驟可以看出,最重要的是第二步,本文來講解三種方式實現元素分堆。

第一種:雙指標 i、j 同時從左右兩端進行工作。

當 i == j 時,將基準元素賦值給 i 位置,最後返回 i 的下標 。

然後再將左、右兩部分進行同樣的步驟

詳細**如下:

public

class

main

; system.out.

println

("排序前"

+arrays.

tostring

(nums));

quicksort

(nums,

0,nums.length-1)

; system.out.

println

("排序後"

+arrays.

tostring

(nums));

}public

static

void

quicksort

(int

nums,

int left,

int right)

public

static

intpartition

(int

nums,

int left,

int right)

if(i

//尋找i位置是否有符合的

while

(nums[i]

< temp && i

if(i

} nums[i]

= temp;

return i;

}public

static

void

swap

(int

nums,

int i,

int j)

}

排序前[6, 8, 1, 2, 9, 3, 7]

排序後[1, 2, 3, 6, 7, 8, 9]

第二種是 i 、j 同時從左端開始:

剛開始時 j 所在的元素 小於基準元素 所以 i j 交換 ,i 往後移一位

- 此時 i j 需要交換,i 往後移動一位,j 從當前位置繼續尋找 ,找到繼續換:

- 重複以上步驟,當 j == right 時,終止尋找:

- 當 j == right 時,交換 i j ,返回 i 的下標。

以上就是根據基準元素進行分堆的過程,詳細**:

public

class

main

; system.out.

println

("排序前"

+arrays.

tostring

(nums));

quicksort

(nums,

0,nums.length-1)

; system.out.

println

("排序後"

+arrays.

tostring

(nums));

}public

static

void

quicksort

(int

nums,

int left,

int right)

public

static

intpartition

(int

nums,

int left,

int right)

}swap

(nums, i, right)

;return i;

}public

static

void

swap

(int

nums,

int i,

int j)

}

排序前[6, 8, 1, 2, 9, 3, 7]

排序後[1, 2, 3, 6, 7, 8, 9]

第三種方法待續。。。

三種快速排序

3種快排的實現方式,1是不適合重複元素多,2可以適應重複元素多,3可以優化重複元素多的時間 author hxj 2020年7月27日 public class main int l 0,r arr.length 1 quicksort arr,l,r private static void qui...

list排序的三種實現方式

用了一段時間的gridview,對gridview實現的排序功能比較好奇,而且利用c 自帶的排序方法只能對某乙個字段進行排序,今天demo了一下,總結了三種對list排序的方法,並實現動態傳遞欄位名對list進行排序。首先先介紹一下平時最常用的幾種排序方法。第一種 實體類實現icomparable ...

c list排序的三種實現方式

摘自 用了一段時間的gridview,對gridview實現的排序功能比較好奇,而且利用c 自帶的排序方法只能對某乙個字段進行排序,今天demo了一下,總結了三種對list排序的方法,並實現動態傳遞欄位名對list進行排序。首先先介紹一下平時最常用的幾種排序方法。第一種 實體類實現icomparab...