選取乙個初始值
將所有比該初始值大的數置於初始值的右邊,所有比該初始值小的數置於初始值的左邊
迴圈以上操作,直到完成排序為止。
首先,第一輪迴圈時分為兩步。
第一步:從最右邊向左依次遍歷,查詢比初始值小的數,找到之後,更改arr[left]的值, 同時 left ++,即把小的數扔到左邊去
第二步:從最左邊向右依次遍歷,查詢比初始值大的數,找到之後,更改arr[right]的值, 同時 right –,即把大的數扔到右邊去。
第三步:判斷整個陣列的排序是否結束,如果沒有結束,就依次迴圈排序
這裡 left++ 及 right– 的意思是,由於這一輪排序我們只需要讓初始值左邊的數均小於初始值,右邊的數均大於初始值,因此找到符合條件的數後直接扔到初始值的左邊或者右邊,而不需要理會扔過去後的大小排序問題,這一輪我們只負責初始值的排序及定位。而在扔過去了之後,此次迴圈中那一位就不用再判斷了,因此++或–。當left與right相等時,表示到了中間點,將其賦值為初始值即可。
public
class
quicksort
system.out.println("修改前");
for (int i : arr)
system.out.println("");
new quicksort().sortmethodone(0, arr.length - 1);
system.out.println("修改後");
for (int i : arr)
}/**
* *@param arr
* 目標陣列
*@param min
* 排序的陣列的起始位
*@param max
* 排序的陣列的結束位
*/private
void
sortmethodone(int min, int max)
// 找到後將arr[right]賦值給arr[left]
arr[left] = arr[right];
// 第二步:從左向右遍歷,找到乙個比tempnumber大的數
while (left < right && arr[left] <= tempnumber)
// 找到後將arr[left]賦值給arr[right]
arr[right] = arr[left];
}// 中間數賦值
arr[left] = tempnumber;
// 遍歷整理左邊的數
if (left > min)
// 遍歷整理右邊的數
if (right < max)
}}
方法一: 三數取中間值
思路:取最左邊的數a,中間位置的數b,最右邊的數c,將他們進行乙個排序,取中間的值作為初始值。
例如:
int temp = 交換後的結果為,這樣的話就相當於是只交換了1和9的位置,而我們又依次迴圈了很多次,效率比起來的話肯定就太低了。從概率上來講,通過三數取中間值的效率是最高的,可以避免取到的初始值一開始就為極端數的情況,一定程度上可以提公升執行的效率。
方法二: 雙向遍歷
方法三: 減少交換次數
優化方法在這裡只是乙個提點,具體如何實現以及其他的優化可以視情況而定,多個優化方法也可以視情況整合,這個就看自己了。
快速排序 快速排序與數學歸納法
public delegate bool comparedelegate hpoint2d point0,hpoint2d point1 public void quiksort listlstpoint,int indexs,int indexe,comparedelegate compare p...
排序演算法 歸納總結
一 直接插入排序 氣泡排序和簡單選擇排序是最基本的排序方法,它們主要用於元素個數n n 10000 不是很大的情形。它們的平均複雜度均為o n 2 實現也比較簡單。1 直接插入排序對於規模很小的元素序列 n 25 非常有效。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需...
hdu 拓撲排序歸納
拓撲排序,其本質是輸出乙個全序關係,對於按要求輸出給定關係的題目,一般就是按照題目要求實現這個全序關係,這種題時常會先給乙個偏序關係,然後給出剩下的元素如何建立關係 字典序之類的 如果忘了那幾個詞是啥意思.偏序關係 滿足自反,反對稱,傳遞性的關係 全序關係 乙個偏序關係r,且對任意x,y有xry或y...