傳統的快速排序法實現如下:
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 ...