快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
步驟為:
從數列中挑出乙個元素,稱為 "基準"(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
在簡單的偽**中,此演算法可以被表示為:
procedurequicksort(a, left, right)ifright > left對於待排序的輸入順序之所有排列情形的平均比較次數,可以藉由解出以下遞迴關係式可以精確地算出來。select a pivot value a[pivotindex]
pivotnewindex := partition(a, left, right, pivotindex)
quicksort(a, left, pivotnewindex-1)
quicksort(a, pivotnewindex+1, right)
在這裡,n-1 是分割槽所使用的比較次數。因為基準值是相當均勻地落在排列好的數列次序之任何地方,總和就是所有可能分割槽的平均。故,快速排序的平均時間複雜度為
c版本演算法實現:
lua版本演算法實現:#include "stdio.h"
int partition(int data, int left, int right)
}data[left] = data[j];
data[j] = key;
return j;
#endif
#if 0
//單向掃瞄
int key = data[left];
int temp = data[left];
data[left] = data[right];
data[right] = temp;
int i = left, j = left;
while(i < right)
++i;
}int __temp = data[right];
data[right] = data[j];
data[j] = __temp;
return j;
#endif
#if 1
//雙向掃瞄(有相同元素不影響排序)
int key = data[left];
int i = left;
int j = right;
while(i < j)
data[i] = key;
return i;
#endif
}void quick_sort(int data, int low, int high)
}void print_data(int data, int len)
printf("\n");
}void main()
; int size = sizeof(data)/sizeof(int);
printf("before quick sort:\n");
print_data(data, size);
#if 1
printf("after quick sort:\n");
quick_sort(data, 0, size-1);
print_data(data, size);
#endif
}
local t =
function partition(t, left, right)
------------
-- 單向掃瞄
local key = t[left]
local index = left
t[index],t[right] = t[right],t[index]
local i = left
while i < right do
if key >= t[i] then
t[index],t[i] = t[i],t[index]
index = index + 1
endi = i + 1
endt[right],t[index] = t[index],t[right]
return index;
------------
---- 雙向掃瞄
local key = t[left]
local i = left
local j = right
while i < j do
while i < j and t[j] >= key do
j = j - 1
endif i < j then
t[i] = t[j]
i = i + 1
endwhile i < j and t[i] <= key do
i = i + 1
endif i < j then
t[j] = t[i]
j = j - 1
endend
--最後i,j相等
t[i] = key
return i
endfunction quick_sort(t, low, high)
if low < high then
local index = partition(t, low, high)
quick_sort(t, low, index-1)
quick_sort(t, index+1, high)
endendprint("---before quick sort---")
print(table.concat(t,' '))
print("---after quick sort---")
quick_sort(t, 1, #t)
print(table.concat(t,' '))
常用排序演算法之快速排序
快速排序 快速排序也是一種分治的遞迴演算法。取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端 右端...
常用排序演算法之快速排序
快速排序最壞情況執行時間為o n2 但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好 期望的執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。快速排序主要利用了分治的思想。一般分為三步進行 分...
常用演算法之快速排序
演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...