快速排序
演算法思想:基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換lo和hi位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復迴圈,直到lo>=hi,然後把基準點的值放到hi這個位置。一次排序就完成了。以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。
排序過程:
演算法實現:
public快速排序的時間複雜度為o(nlogn).static
int partition(int array,int lo,int
hi) array[lo]=array[hi];
while(array[lo]<=key&&hi>lo)
array[hi]=array[lo];
}array[hi]=key;
return
hi; }
public
static
void sort(int array,int lo ,int
hi)
int index=partition(array,lo,hi);
sort(array,lo,index-1);
sort(array,index+1,hi);
}
快速排序的優化
對於基準位置的選取一般有三種方法:固定切分,隨機切分和三取樣切分。固定切分的效率並不是太好,隨機切分是常用的一種切分,效率比較高,最壞情況下時間複雜度有可能為o(n2).對於三數取中選擇基準點是最理想的一種。
三數取中切分:
public快速排序在序列中元素很少時,效率將比較低,不然插入排序,因此一般在序列中元素很少時使用插入排序,這樣可以提高整體效率。static
int partition(int array,int lo,int
hi)
if(array[lo]>array[hi])
if(array[mid]>array[lo])
int key=array[lo];
while(lo
array[lo]=array[hi];
while(array[lo]<=key&&hi>lo)
array[hi]=array[lo];
}array[hi]=key;
return
hi; }
public
static
void swap(int a,int
b)
public
static
void sort(int array,int lo ,int
hi)
int index=partition(array,lo,hi);
sort(array,lo,index-1);
sort(array,index+1,hi);
}
publicstatic
void quick(int array ,int lo,int
hi)else
}
java 快速排序
public class myquicksort while strvoid middle strvoid low lowif low hight else if hight middle temp strvoid hight strvoid hight strvoid low strvoid lo...
快速排序(java)
快速排序 public class quacksort int pivot arr low 取第乙個數作為中間數 左滑塊當前的下標數,從第二個數字開始,從最後乙個開始 int left low 1 int right high 右滑塊當前的下標數 while left right 從右邊開始找 wh...
快速排序(Java)
快速排序的思想是基於分治法加上遞迴思想,排序陣列時,將陣列分成兩個小部分,然後對它們遞迴排序,直到它們都不可再分為止。快速排序的平均執行時間是o nlog n 遠比插入排序的o n 2 時間小。快速排序 param arr param start param end return private s...