比較排序之快速排序(實(shí)例代碼)
快速排序(簡(jiǎn)稱(chēng)快排)因?yàn)槠湫瘦^高(平均O(nlogn))經(jīng)常在筆試題中對(duì)其考查。
對(duì)于快排的第一步是選取一個(gè)“基數(shù)”,將會(huì)用這個(gè)“基數(shù)”與其它數(shù)進(jìn)行比較交換。而這個(gè)“基數(shù)”的選擇將影響到快排的效率如何,但如果為了選擇基數(shù)而選擇基數(shù)則會(huì)本末倒置。例如為了找到最佳基數(shù),則需要在整個(gè)待排序列中找到中位數(shù),但查找中位數(shù)實(shí)際上代價(jià)又會(huì)很高?;鶖?shù)的選擇通常來(lái)說(shuō)就是待排序序列中的第一個(gè)對(duì)象或者中間的一個(gè)對(duì)象或者最后一個(gè)對(duì)象。本文以選取第一個(gè)元素為例對(duì)快排做一個(gè)簡(jiǎn)要分析實(shí)現(xiàn)。
以待排序列{6, 5, 3, 1, 7, 2, 4}為例,選取第一個(gè)元素6為基數(shù)。

選擇了基數(shù)過(guò)后則需要進(jìn)行和數(shù)組元素進(jìn)行比較交換,如何進(jìn)行比較和誰(shuí)進(jìn)行比較?快排第二步在數(shù)組的第一個(gè)元素和最后元素各設(shè)置一個(gè)“哨兵”。

選好基數(shù),設(shè)置好哨兵過(guò)后,接下來(lái)則是開(kāi)始比較,將基數(shù)先與最后一個(gè)哨兵j進(jìn)行比較,如果大于哨兵j則與其進(jìn)行交換同時(shí)哨兵i+1。

此時(shí)基數(shù)不再與哨兵j進(jìn)行比較,而是與哨兵i進(jìn)行比較,如果基數(shù)大于哨兵i,則哨兵一直向后移,直到大于基數(shù)為止交換同時(shí)哨兵j-1。


重復(fù)上面的步驟,基數(shù)再與哨兵j比較。

最終結(jié)果可見(jiàn)哨兵i的位置=哨兵j的位置,此時(shí)將基數(shù)賦值給這個(gè)位置。

這樣就達(dá)到了基數(shù)6左邊的數(shù)字均小于它,右邊的數(shù)字均大于它,再利用遞歸對(duì)其左右數(shù)組進(jìn)行同樣的步驟選取基數(shù),設(shè)置哨兵,最后即可完成排序。
java
package com.algorithm.sort.quick;
import java.util.Arrays;
/**
* 快速排序
* Created by yulinfeng on 2017/6/26.
*/
public class Quick {
public static void main(String[] args) {
int[] nums = {6, 5, 3, 1, 7, 2, 4};
nums = quickSort(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
/**
* 快速排序
* @param nums 待排序數(shù)組序列
* @param left 數(shù)組第一個(gè)元素索引
* @param right 數(shù)組最后一個(gè)元素索引
* @return 排好序的數(shù)組序列
*/
private static int[] quickSort(int[] nums, int left, int right) {
if (left < right) {
int temp = nums[left]; //基數(shù)
int i = left; //哨兵i
int j = right; //哨兵j
while (i < j) {
while (i < j && nums[j] >= temp) {
j--;
}
if (i < j) {
nums[i] = nums[j];
i++;
}
while (i < j && nums[i] < temp) {
i++;
}
while (i < j) {
nums[j] = nums[i];
j--;
}
}
nums[i] = temp;
quickSort(nums, left, i - 1);
quickSort(nums, i + 1, right);
}
return nums;
}
}
Python3
#快速排序
def quick_sort(nums, left, right):
if left < right:
temp = nums[left] #基數(shù)
i = left #哨兵i
j = right #哨兵j
while i < j:
while i < j and nums[j] >= temp:
j -= 1
if i < j:
nums[i] = nums[j]
i += 1
while i < j and nums[i] < temp:
i += 1
if i < j:
nums[j] = nums[i]
j -= 1
nums[i] = temp
quick_sort(nums, left, i - 1)
quick_sort(nums, i + 1, right)
return nums
nums = [6, 5, 3, 1, 7, 2, 4]
nums = quick_sort(nums, 0, len(nums) - 1)
print(nums)
以上這篇比較排序之快速排序(實(shí)例代碼)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
swagger?@ApiModel添加實(shí)體類(lèi)不生效的解決
這篇文章主要介紹了swagger?@ApiModel添加實(shí)體類(lèi)不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
SpringBoot?spring.factories加載時(shí)機(jī)分析
這篇文章主要為大家介紹了SpringBoot?spring.factories加載時(shí)機(jī)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題
這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
在Java中避免NullPointerException的解決方案
這篇文章主要介紹了在Java中避免NullPointerException的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Spring Boot使用Druid和監(jiān)控配置方法
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,并且能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。下面來(lái)說(shuō)明如何在 Spring Boot 中配置使用Druid2017-04-04
Java多線(xiàn)程Future實(shí)現(xiàn)優(yōu)雅獲取線(xiàn)程的執(zhí)行結(jié)果
這篇文章主要為大家詳細(xì)介紹了Java如何利用Future實(shí)現(xiàn)優(yōu)雅獲取線(xiàn)程的執(zhí)行結(jié)果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射
默認(rèn)情況下,MyBatis-Plus 是不支持直接映射 JSON 類(lèi)型的,這時(shí)候就需要借助其他的方法,下面小編就來(lái)和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧2025-04-04

