您好,登錄后才能下訂單哦!
快速排序(簡(jiǎn)稱快排)因?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ù)的選擇通常來說就是待排序序列中的第一個(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ù)過后則需要進(jìn)行和數(shù)組元素進(jìn)行比較交換,如何進(jìn)行比較和誰進(jìn)行比較?快排第二步在數(shù)組的第一個(gè)元素和最后元素各設(shè)置一個(gè)“哨兵”。
選好基數(shù),設(shè)置好哨兵過后,接下來則是開始比較,將基數(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é)果可見哨兵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è)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。