package sort;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* å¿«éæåº
*
* å¿«éæåºéè¿ä¸ä¸ªååå
ç´ å°æ°ç»åä¸ºä¸¤ä¸ªåæ°ç»ï¼å·¦åæ°ç»å°äºçäºååå
ç´ ï¼
* å³åæ°ç»å¤§äºçäºååå
ç´ ï¼å°è¿ä¸¤ä¸ªåæ°ç»æåºä¹å°±å°æ´ä¸ªæ°ç»æåºäºã
*
*
æ§è½åæ
*
* å¿«éæåºæ¯åå°æåºï¼ä¸éè¦è¾
婿°ç»ï¼ä½æ¯éå½è°ç¨éè¦è¾
婿 ã
*
* å¿«éæåºæå¥½çæ
åµä¸æ¯æ¯æ¬¡é½æ£å¥½è½å°æ°ç»å¯¹ååï¼è¿æ ·éå½è°ç¨æ¬¡æ°ææ¯æå°çã
* è¿ç§æ
åµä¸æ¯è¾æ¬¡æ°ä¸º CN=2CN/2+Nï¼å¤æåº¦ä¸º O(NlogN)ã
*
* æåçæ
åµä¸ï¼ç¬¬ä¸æ¬¡ä»æå°çå
ç´ ååï¼ç¬¬äºæ¬¡ä»ç¬¬äºå°çå
ç´ ååï¼å¦æ¤è¿è¬ã
* å æ¤æåçæ
åµä¸éè¦æ¯è¾ N2/2ã为äºé²æ¢æ°ç»æå¼å§å°±æ¯æåºçï¼å¨è¿è¡å¿«éæåºæ¶éè¦éæºæä¹±æ°ç»ã
*
* ç®æ³æ¹è¿
*
* ï¼ä¸ï¼åæ¢å°æå
¥æåº
*
* å 为快éæåºå¨å°æ°ç»ä¸ä¹ä¼éå½è°ç¨èªå·±ï¼å¯¹äºå°æ°ç»ï¼æå
¥æåºæ¯å¿«éæåºçæ§è½æ´å¥½ï¼
* å æ¤å¨å°æ°ç»ä¸å¯ä»¥åæ¢å°æå
¥æåºã
*
* ï¼äºï¼ä¸æ°åä¸
*
* æå¥½çæ
åµä¸æ¯æ¯æ¬¡é½è½åæ°ç»çä¸ä½æ°ä½ä¸ºååå
ç´ ï¼ä½æ¯è®¡ç®ä¸ä½æ°ç代价å¾é«ã
* 人们åç°å 3 个å
ç´ å¹¶å°å¤§å°å±
ä¸çå
ç´ ä½ä¸ºååå
ç´ çæææå¥½ã
*
* ï¼ä¸ï¼ä¸ååå
*
* å¯¹äºæå¤§ééå¤å
ç´ çæ°ç»ï¼å¯ä»¥å°æ°ç»åå为ä¸é¨åï¼åå«å¯¹åºå°äºãçäºå大äºååå
ç´ ã
*
* ä¸åååå¿«éæåºå¯¹äºåªæè¥å¹²ä¸å主é®çéæºæ°ç»å¯ä»¥å¨çº¿æ§æ¶é´å
宿æåºã
*
* @author å壮é£
* https://github.com/zfman.
* https://blog.csdn.net/lzhuangfei.
*/
public class QuickSort> extends Sort {
@Override
public void sort(T[] nums) {
shuffle(nums);
sort(nums,0,nums.length-1);
}
public void sort(T[] nums,int l,int h){
if(l>=h) return;
int j=partition(nums,l,h);
sort(nums,l,j-1);
sort(nums,j+1,h);
}
/**
* åå
* @param nums
* @param l
* @param h
* @return
*/
public int partition(T[] nums,int l,int h){
int i=l,j=h+1;
T v=nums[l];
while(true){
while(j!=l&&less(v,nums[--j]));
while(i!=h&&less(nums[++i],v));
if(i>=j) break;
swap(nums,i,j);
}
swap(nums,l,j);
return j;
}
/**
* æä¹±é¡ºåº
* @param nums
*/
public void shuffle(T[] nums){
List list=Arrays.asList(nums);
Collections.shuffle(list);
list.toArray(nums);
}
public static void main(String[] args){
Integer[] arr={
5,1,8,7,10,6,9,5,20,3,0
};
Sort sort=new QuickSort<>();
sort.sort(arr);
ArrayUtils.printArray(arr);
}
}