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

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

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

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


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

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

這樣就達到了基數(shù)6左邊的數(shù)字均小于它,右邊的數(shù)字均大于它,再利用遞歸對其左右數(shù)組進行同樣的步驟選取基數(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ù)組第一個元素索引
* @param right 數(shù)組最后一個元素索引
* @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)
以上這篇比較排序之快速排序(實例代碼)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?spring.factories加載時機分析
這篇文章主要為大家介紹了SpringBoot?spring.factories加載時機分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Java如何解決發(fā)送Post請求報Stream?closed問題
這篇文章主要介紹了Java如何解決發(fā)送Post請求報Stream?closed問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
在Java中避免NullPointerException的解決方案
這篇文章主要介紹了在Java中避免NullPointerException的解決方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Spring Boot使用Druid和監(jiān)控配置方法
Druid是Java語言中最好的數(shù)據(jù)庫連接池,并且能夠提供強大的監(jiān)控和擴展功能。下面來說明如何在 Spring Boot 中配置使用Druid2017-04-04
Java多線程Future實現(xiàn)優(yōu)雅獲取線程的執(zhí)行結(jié)果
這篇文章主要為大家詳細介紹了Java如何利用Future實現(xiàn)優(yōu)雅獲取線程的執(zhí)行結(jié)果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
MyBatis-Plus實現(xiàn)優(yōu)雅處理JSON字段映射
默認情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時候就需要借助其他的方法,下面小編就來和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧2025-04-04

