快速排序及其優化(三數中值法)

2021-09-23 01:47:13 字數 1816 閱讀 3785

傳統的快速排序法實現如下:

def quicksort(l,left,right):

if left>=right:

return

base=l[left]

r=right

l=left

while left=base:

right-=1

l[left]=l[right]

while left改進的三數中值法思想及實現:

5     3    4    9    1    0     8(原始排列)

現在選取兩端及中間共三個數,即:5     9     8。並將其按照從小到大排序:5     8     9,在依次放回兩端和中間可得:

53     481      09

將8作為樞紐值,並存放在倒數第二個位置(8與0進行交換):

53     4     0     189

『假設該排列第乙個數的下標為0,且向右依次增長1,直至該排列結束。設定i,j哨兵,實現雙向掃瞄。i從左向右掃瞄,找比樞紐值大的數,j從樞紐值左邊第乙個位置開始向右掃瞄,找比樞紐值小的數,若i,j都找到了則實現交換。往復迴圈上述操作,直至i,j相遇,則第一輪排序結束』

i從下標為0,即值為5的位置開始向右掃瞄找比8大的數,直到與j(下標為5,值為8的位置)相遇也沒找到,則第一輪排序結束。此時8左邊的數都比8小,8右邊的數都比8大。

然後遞迴實現對子序列的相同處理:

5     3     4     0     1(原始子串行)

13      045(取三數,排序,將樞紐值放倒數第二的位置)

…………………………(省略以後的步驟)

『嗯……這例子取的不好,沒有用到雙向掃瞄再交換』

具體**實現如下:

def swap(l,left,right):

l[left],l[right]=l[right],l[left]

def initbase(l,left,right):

mid=(left+right)//2

#將三數排序

if l[left]>l[mid]:

swap(l,left,mid)

if l[left]>l[right]:

swap(l,left,right)

if l[mid]>l[right]:

swap(l,mid,right)

#將樞紐值放在末尾

swap(l,mid,right-1)

def quicksortm3(l,left,right):

if left>=right:

return

initbase(l,left,right)

l=left

r=right-1

base=l[right-1]

while l=base:

r-=1

if lbase:

swap(l,l,right-1)

quicksortm3(l,left,l-1)

quicksortm3(l,l+1,right)

我這裡將 過程也輸出了出來

快速排序及其優化

include include 呼叫c 自帶sort include include include using namespace std define max 1000000 define k 12 ifdef debug define new new normal block,file lin...

快速排序及其優化

快速排序是比較經典 常用的演算法,下面簡要介紹其思路。對於乙個陣列,選取某個元素作為切分元素 比如第乙個元素 然後把比這個元素小的都放到它前面,比這個元素大的都放到它後面,這樣切分元素的最終位置就確定了,並且陣列被劃分為兩個子陣列。然後再用同樣的方法分別對子陣列進行排序,最終整個陣列將變成有序的。這...

快速排序及其優化

package com.zc.algorithm public class quicksort 如果不大於,則把右邊的數賦值給左邊 arr left arr right 如果左邊的數小於基數,則向右移動 while left arr right 把最大值放在陣列的末尾 if arr mid arr ...