常用排序演算法之快速排序c及lua實現

2021-06-22 16:12:28 字數 3207 閱讀 6925

快速排序使用分治法(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版本演算法實現:

#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

}

lua版本演算法實現:

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 ...