快速排序 歸納

2021-07-10 12:00:52 字數 1743 閱讀 4693

選取乙個初始值

將所有比該初始值大的數置於初始值的右邊,所有比該初始值小的數置於初始值的左邊

迴圈以上操作,直到完成排序為止。

首先,第一輪迴圈時分為兩步。

第一步:從最右邊向左依次遍歷,查詢比初始值小的數,找到之後,更改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...