Sap xep nhanh (Quicksort), con đuoc goi la sap xep kieu phan chia (part sort) la mot thuat toan sap xep phat trien boi C.A.R. Hoarec sap thanh hai danh sach con. Khac voi sap xep tron, chia danh sach can sap xep 
  
    
      
        a
        [
        1..
        n
        ]
      
    
    {\displaystyle a[1..n]}
  
 thanh hai danh sach con co kich thuoc tuong đoi bang nhau nho chi so đung giua danh sach, sap xep nhanh chia no thanh hai danh sach bang cach so sanh tung phan tu cua danh sach voi mot phan tu đuoc chon đuoc goi la phan tu chot. Nhung phan tu nho hon hoac bang phan tu chot đuoc đua ve phia truoc va nam trong danh sach con thu nhat, cac phan tu lon hon chot đuoc đua ve phia sau va thuoc danh sach đung sau. Cu tiep tuc chia nhu vay toi khi cac danh sach con đeu co đo dai bang 1.


Phan tu chot (pivot) Ky thuat chon phan tu chot  anh huong kha nhieu đen kha nang roi vao cac vong lap vo han đoi voi cac truong hop đac biet. Tot nhat la chon phan tu chot la trung vi cua danh sach. Khi đo sau 
  
    
      
        l
        o
        
          g
          
            2
          
        
        (
        n
        )
      
    
    {\displaystyle log_{2}(n)}
  
 lan phan chia ta se đat toi kich thuoc danh sach bang 1. Tuy nhien đieu đo rat kho. Co cac cach chon phan tu chot nhu sau:

Chon phan tu đung đau hoac đung cuoi lam phan tu chot.
Chon phan tu đung giua danh sach lam phan tu chot.
Chon phan tu trung vi trong 3 phan tu đung đau, đung giua va đung cuoi lam phan tu chot.
Chon phan tu ngau nhien lam phan tu chot. (Cach nay co the dan đen kha nang roi vao cac truong hop đac biet)


Thuat phan chia Sau khi phan tu chot đuoc chon giai thuat phan chia nen tien hanh nhu the nao?

Mot giai phap đon gian nhat cho van đe nay la duyet tu đau đen cuoi lan luot so sanh cac phan tu cua danh sach voi phan tu chot. Theo cach nay, ta phai tien hanh n phep so sanh, ngoai ra con phai danh n đon vi bo nho đe luu giu cac gia tri trung gian.
Mot giai phap khac đuoc đe nghi la duyet theo hai đuong. Mot đuong tu đau danh sach, mot đuong tu cuoi danh sach. Theo cach nay, ta tim phan tu đau tien tinh tu trai lon hon phan tu chot va phan tu đau tien phia phai nho hon hoac bang phan tu chot roi đoi cho cho nhau. Tiep tuc nhu vay cho đen khi hai đuong gap nhau.
Đe co the goi đe quy ta xet bai toan phan chia mot danh sach con cua a: 
  
    
      
        a
        [
        
          k
          
            1
          
        
        ,
        
          k
          
            2
          
        
        ]
      
    
    {\displaystyle a[k_{1},k_{2}]}
  
 thanh hai danh sach.


Vi du Trong vi du sau đay ta luon chon phan tu chot la phan tu đung giua danh sach voi chi so cua phan tu chot đuoc chon la 
  
    
      
        k
        =
        i
        n
        t
        (
        (
        
          k
          
            1
          
        
        +
        
          k
          
            2
          
        
        )
        
          /
        
        2
        )
      
    
    {\displaystyle k=int((k_{1}+k_{2})/2)}
  

  
    
      
        a
        =
        (
        2
        ,
        6
        ,
        3
        ,
        7
        ,
        4
        ,
        5
        ,
        1
        )
      
    
    {\displaystyle a=(2,6,3,7,4,5,1)}
  

Do ngau nhien, phan tu chot 
  
    
      
        a
        [
        4
        ]
        =
        7
      
    
    {\displaystyle a[4]=7}
  
 la phan tu lon nhat trong day, ta tim tu trai sang phai khong co phan tu nao lon hon phan tu chot, do đo ta đoi phan tu chot voi phan tu cuoi cung, danh sach đuoc chia thanh hai danh sach con 
  
    
      
        a
        [
        1..6
        ]
      
    
    {\displaystyle a[1..6]}
  
 va 
  
    
      
        a
        [
        7..7
        ]
      
    
    {\displaystyle a[7..7]}
  

Viec phan chia tiep tuc voi danh sach con
  
    
      
        a
        [
        1..6
        ]
      
    
    {\displaystyle a[1..6]}
  
. Phan tu chot đuoc chon la a[4]=1. Tu trai sang phai tim đuoc phan tu đau tien lon hon 
  
    
      
        a
        [
        4
        ]
        =
        1
      
    
    {\displaystyle a[4]=1}
  
 la 
  
    
      
        a
        [
        1
        ]
        =
        2
      
    
    {\displaystyle a[1]=2}
  
, tu phai sang phan tu đau tien <=1 la chinh a[4]. Đoi cho hai phan tu nay

Đi tiep sang phai ta đuoc 
  
    
      
        a
        [
        2
        ]
        >
        1
      
    
    {\displaystyle a[2]>1}
  
, o phia nguoc lai đi tiep sang trai tim đuoc phan tu nho hon hoac bang chot la chinh 
  
    
      
        a
        [
        1
        ]
        =
        1
      
    
    {\displaystyle a[1]=1}
  
 nhung luc nay hai đuong đa cham nhau nen ta khong đoi nua. Do vay 
  
    
      
        a
        [
        1..6
        ]
      
    
    {\displaystyle a[1..6]}
  
 đuoc phan chia thanh hai danh sach con 
  
    
      
        a
        [
        1..1
        ]
      
    
    {\displaystyle a[1..1]}
  
 va 
  
    
      
        a
        [
        2..6
        ]
      
    
    {\displaystyle a[2..6]}
  

Tiep tuc phan chia 
  
    
      
        a
        [
        2..6
        ]
      
    
    {\displaystyle a[2..6]}
  
 voi phan tu chot 
  
    
      
        a
        [
        4
        ]
        =
      
    
    {\displaystyle a[4]=}
  
2 ta đuoc

Tiep tuc phan chia 
  
    
      
        a
        [
        3..6
        ]
      
    
    {\displaystyle a[3..6]}
  
 voi phan tu chot 
  
    
      
        a
        [
        5
        ]
        =
        4
      
    
    {\displaystyle a[5]=4}
  
 ta đuoc

Tiep tuc phan chia 
  
    
      
        a
        [
        3..4
        ]
      
    
    {\displaystyle a[3..4]}
  
 voi phan tu chot 
  
    
      
        a
        [
        4
        ]
        =
        4
      
    
    {\displaystyle a[4]=4}
  
 va 
  
    
      
        a
        [
        5..6
        ]
      
    
    {\displaystyle a[5..6]}
  
 voi phan tu chot 
  
    
      
        a
        [
        6
        ]
        =
        5
      
    
    {\displaystyle a[6]=5}
  
 ta đuoc


Ma gia = Thu tuc phan chia =

  // left la chi so cua phan tu đau tien cua mang
  // right la chi so cua phan tu cuoi cung cua mang
  // so phan tu cua mang = right-left+1
function partition(array, 'left', 'right', 'pivotIndex')
   1.'pivotValue':= array['pivotIndex']
   2.swap array['pivotIndex'] and array['right']  // Move pivot to end
   3.'storeIndex':= 'left'
   4.for 'i' from 'left' to 'right'-1  // left ≤ i < right
         1.if array['i'] < 'pivotValue'
             1.swap array['i'] and array['storeIndex']
             2.'storeIndex':= 'storeIndex' + 1
   5.swap array['storeIndex'] and array['right']  // Move pivot to its final place
   6.return 'storeIndex'


= Quick sort đe quy =

 function quicksort(array, 'left', 'right')
     // If the list has 2 or more items
     if 'left' < 'right'
         // See "Choice of pivot" section below for possible choices
         choose any 'pivotIndex' such that 'left' ≤ 'pivotIndex' ≤ 'right'
         // Get lists of bigger and smaller items and final position of pivot
         'pivotNewIndex':= partition(array, 'left', 'right', 'pivotIndex')
         // Recursively sort elements smaller than the pivot
         quicksort(array, 'left', 'pivotNewIndex' - 1)
         // Recursively sort elements at least as big as the pivot
         quicksort(array, 'pivotNewIndex' + 1, 'right')


= Quick sort đe quy co su dung cau truc du lieu C: =


= Khu đe quy =
Nhieu nguoi cho rang viec khu đe quy cua sap xep nhanh thuc ra khong can thiet, no chi co tac dung cho nhung nguoi moi tiep can khoa hoc may tinh hieu sau sac hon ve khai niem đe quy. Ban chat cua cac giai thuat đe quy la luu tru cac tham bien đe quy vao mot ngan xep (stack) đe lan luot lay ra xu ly.
Khi khu đe quy cua giai thuat đe quy, moi lan phan chia danh sach thanh 2 danh sach con ta luu tru cac tham so cua danh sach đung sau vao mot ngan xep, roi phan chia tiep danh sach đung truoc.
Giai thuat đon gian nhat đe khu đe quy cua sap xep nhanh nhu sau:

Procedure QuickSort(a[1..n]) {
 Var list S, E; Int m:=1
 S(m):=1; E(m):= n;
 While m>0  {
   k=S(m); l=E(m)
   m:=m-1;
    if l<k  then {
       i=Part(k,l);
       m=m+1;
       S(m):=i+1
       E(m):=l
    }
 }
 }

Uu điem cua sap xep nhanh khong đe quy nam o nhung cai tien cua giai thuat tren đay. Co the cai tien theo nhung huong sau: Cat vao ngan xep danh sach con it phan tu hon trong hai danh sach con va đoi voi cac danh sach con co đo dai đu nho thi dung mot phuong phap sap xep so cap (chang han sap xep chen).


= Quick sort chia ba =
Mot phuong phap chia khac la chia danh sach thanh 3 danh sach con, lan luot nho hon, bang va lon hon phan tu chot.

function quicksort(a)
   Var list less, equal, greater
    if length(a) ≤ 1
        return a
    else
        select a pivot value pivot from a
        for each x in a
            if x < pivot then add x to less
            if x = pivot then add x to equal
            if x > pivot then add x to greater
        return concatenate(quicksort(less), equal, quicksort(greater))


Xem them Sap xep noi bot
Sap xep chon
Sap xep chen
Sap xep tron
Sap xep vun đong


Tham khao