隨機選取乙個基數(一般是陣列的第乙個)---->(小技巧:可以在陣列中隨機取乙個元素換到首位作為基準元素)
進行排序,把小於基數的放到左邊,大於基數的放到右邊;
分別對基數的左、右部分重新進行步驟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]第二種是 i 、j 同時從左端開始:排序後[1, 2, 3, 6, 7, 8, 9]
剛開始時 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...