1.選取樞紐元:三數中值分割法,得到的中間值即作為mid,將陣列分為arrays[mid]左邊的比它小,右邊的比它大
2.進行劃分partition:首先將arrays[mid]放在arrays[high]處,然後對陣列範圍內的數值進行比較,
(左右兩邊分別有乙個指標來進行尋找,arrays[left] <= arrays[high],arrays[right] >= arrays[high])找到不符合要求的值,在左右交換位置。
在left>=right時,終止查詢,然後將swap(arrays, left, high);即可將樞紐元放入合適的位置
3.迴圈進行左右兩側的選擇樞紐元,劃分
注意:在partition之後,傳回來的是劃分好之後arrays[mid]應該在的位置,而不再是mid處了
排序中的劃分部分可以衍生出很多的問題:
資料結構--荷蘭國旗問題
利用荷蘭國旗問題的解法衍生出的隨機快排解法
注意在生成隨機數時,是 (int)(math.random() * (right - left + 1))+ left
快排優化:* 1.使用荷蘭國旗法進行劃分
* 2.使用隨機快排:將一直選取最後乙個數進行比較的經典快排,改為隨機選取乙個數進行比較
* 生成隨機數的方法 int num = (int)(math.random()*(high - low + 1)+ low
);* 使用空間複雜度o(logn),用來記錄各個遞迴中的斷點,用來進行另外一半的遞迴
* 工程上快排是非遞迴的
public void quicksort(integer arrays)//隨機快排
public void randomquicksort(integer arrays, int left, int right)
public int partitionrandom(integer arrays, int left, int right) else if(arrays[left] > arrays[right]) else
}swap(arrays, right, high);
return new int;
}
一般的解法
package sort;import static sort.printres.swap;
/** * created by skye on 2018/3/27.
*/public class quicksort
public void quicksort(integer arrays, int low, int high)
public int threemid(integer arrays, int low, int high)
public int partition(integer arrays, int low, int high)
while(right > left && arrays[right] >= arrays[high])
swap(arrays, left, right);
}swap(arrays, left, high);
return left;
}}
注意:可以將交換改成覆蓋,來減少交換次數 將partition方法修改
對於小陣列,可以將排序改為插入排序將quicksort(integer arrays, int low, int high)修改
還可以將遞迴改成尾迭代:(不太懂)
最終版
package sort;import static sort.printres.swap;
public class quicksort
public void quicksort(integer arrays, int left, int right) else
arrays[j + 1] = temp;}}
}public int threemid(integer arrays, int left, int right)
public int partition(integer arrays, int left, int right)
//相當於交換arrays[left] arrays[right],交換後,right-1(開始時,right處放置的是樞紐元的值,就是將樞紐元覆蓋掉)
arrays[high--] = arrays[low];
while(high > low && arrays[high] >= temp)
//相當於交換arrays[left] arrays[right],交換後,left+1(此時,arrays[left]的值已經存放在arrays[right]中了)
arrays[low++] = arrays[high];
}//最後再將樞紐元放回到陣列中
arrays[low] = temp;
return low;
}}
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...