您好,登錄后才能下訂單哦!
快速排序(簡稱快排)因為其效率較高(平均O(nlogn))經常在筆試題中對其考查。
對于快排的第一步是選取一個“基數”,將會用這個“基數”與其它數進行比較交換。而這個“基數”的選擇將影響到快排的效率如何,但如果為了選擇基數而選擇基數則會本末倒置。例如為了找到最佳基數,則需要在整個待排序列中找到中位數,但查找中位數實際上代價又會很高。基數的選擇通常來說就是待排序序列中的第一個對象或者中間的一個對象或者最后一個對象。本文以選取第一個元素為例對快排做一個簡要分析實現。
以待排序列{6, 5, 3, 1, 7, 2, 4}為例,選取第一個元素6為基數。
選擇了基數過后則需要進行和數組元素進行比較交換,如何進行比較和誰進行比較?快排第二步在數組的第一個元素和最后元素各設置一個“哨兵”。
選好基數,設置好哨兵過后,接下來則是開始比較,將基數先與最后一個哨兵j進行比較,如果大于哨兵j則與其進行交換同時哨兵i+1。
此時基數不再與哨兵j進行比較,而是與哨兵i進行比較,如果基數大于哨兵i,則哨兵一直向后移,直到大于基數為止交換同時哨兵j-1。
重復上面的步驟,基數再與哨兵j比較。
最終結果可見哨兵i的位置=哨兵j的位置,此時將基數賦值給這個位置。
這樣就達到了基數6左邊的數字均小于它,右邊的數字均大于它,再利用遞歸對其左右數組進行同樣的步驟選取基數,設置哨兵,最后即可完成排序。
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 待排序數組序列 * @param left 數組第一個元素索引 * @param right 數組最后一個元素索引 * @return 排好序的數組序列 */ private static int[] quickSort(int[] nums, int left, int right) { if (left < right) { int temp = nums[left]; //基數 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] #基數 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)
以上這篇比較排序之快速排序(實例代碼)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。