演算法 排序 快速排序

2021-10-03 11:47:21 字數 2192 閱讀 5322

快速排序,說白了就是給基準資料找其正確索引位置的過程.

如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp=23;然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌:low指向起始位置,high指向末尾.

首先從後半部分開始,如果掃瞄到的值大於基準資料就讓high減1,如果發現有元素比該基準資料的值小(如上圖中18<=tmp),就將high位置的值賦值給low位置,結果如下:

然後開始從前往後掃瞄,如果掃瞄到的值小於基準資料就讓low加1,如果發現有元素大於基準資料的值(如上圖46=>tmp),就再將low位置的值賦值給high位置的值,指標移動並且資料交換後的結果如下:

然後再開始從後向前掃瞄,原理同上,發現上圖11<=tmp,則將low位置的值賦值給high位置的值,結果如下:

然後再開始從前往後遍歷,直到low=high結束迴圈,此時low或high的下標就是基準資料23在該陣列中的正確索引位置.如下圖所示.

這樣一遍走下來,可以很清楚的知道,其實快速排序的本質就是把基準數大的都放在基準數的右邊,把比基準數小的放在基準數的左邊,這樣就找到了該資料在陣列中的正確位置.

以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。

一些小結論

從上面的過程中可以看到:

①先從隊尾開始向前掃瞄且當low < high時,如果a[high] > tmp,則high–,但如果a[high] < tmp,則將high的值賦值給low,即arr[low] = a[high],同時要轉換陣列掃瞄的方式,即需要從隊首開始向隊尾進行掃瞄了

②同理,當從隊首開始向隊尾進行掃瞄時,如果a[low] < tmp,則low++,但如果a[low] > tmp了,則就需要將low位置的值賦值給high位置,即arr[low] = arr[high],同時將陣列掃瞄方式換為由隊尾向隊首進行掃瞄.

③不斷重複①和②,知道low>=high時(其實是low=high),low或high的位置就是該基準資料在陣列中的正確索引位置.

按照上訴理論我寫的**如下: 

排序方式:in-place

時間複雜度

空間複雜度

public static void main(string args) );

system.out.println();

quicksort(arrs, 0, arrs.length - 1);

arrays.stream(arrs).foreach(l -> );

system.out.println();

arrays.stream(arrs2).sorted().foreach(l -> );

}public static void quicksort(long arrs, int begin, int end)

}public static int getindex(long arrs, int begin, int end)

// 如果後面元素小於基準元素,則把該元素放到基準元素位置

arrs[begin] = arrs[end];

// 從前往後掃瞄,如果當前元素小於基準元素則前移索引

while (begin < end && arrs[begin] <= tmp)

// 如果當前元素大於基準元素則把當前元素放到後面

arrs[end] = arrs[begin];

}arrs[begin] = tmp;

return begin;

}

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

排序演算法 快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...