概念
快速排序,就是先选定中心轴pivot,比如第一个元素,然后将比pivot小的元素放在左边,比他大的放在右边,然后再对这两个子序列进行快速排序
伪代码
partition(arr)
// 默认用第一个元素作为pivot
pivot <- arr[0]
lp <- 0
rp <- n - 1
while lp < rp do
while lp < rp && arr[rp] >= pivot do
rp--
lp <- rp
while lp < rp && arr[lp] < pivot do
lp++
rp <- lp
pivot_idx <- lp
arr[pivot_idx] <- pivot
return pivot_idx // 这个就是分区界线
quick_sort(arr):
limit <- partition(arr)
quick_sort(arr[:limit-1])
quick_sort(arr[limit+1:])
quick_sort的平均时间复杂度是O(n log n),最坏情况下是O(n^2)(当数组有序时)
代码实现
C
#include <stdio.h>
static size_t partition(int arr[], size_t left, size_t right)
{
int pivot = arr[left];
while (left < right) {
while (left < right && arr[right] >= pivot) right--;
arr[left] = arr[right];
while (left < right && arr[left] <= pivot) left++;
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
static void quick_sort(int arr[], size_t left, size_t right)
{
if (left >= right) return;
size_t mid = partition(arr, left, right);
quick_sort(arr, left, mid - 1);
quick_sort(arr, mid + 1, right);
}
static void print(int arr[], size_t size)
{
for (size_t i = 0; i < size; i++)
printf(" %d", arr[i]);
printf("\n");
}
int main(void)
{
int arr[] = {4, 5, 7, -1, 2, 4, 0};
size_t size = sizeof(arr) / sizeof(arr[0]);
print(arr, size);
quick_sort(arr, 0, size - 1);
print(arr, size);
return 0;
}
Lua
local function partition(arr, left, right)
local pivot = arr[left]
while left < right do
while left < right and arr[right] >= pivot do
right = right - 1
end
arr[left] = arr[right]
while left < right and arr[left] <= pivot do
left = left + 1
end
arr[right] = arr[left]
end
arr[left] = pivot
return left
end
local function quick_sort(arr, left, right)
if left >= right then return end
local mid = partition(arr, left, right)
quick_sort(arr, left, mid - 1)
quick_sort(arr, mid + 1, right)
end
local function print(arr)
for _, v in ipairs(arr) do
io.write(" " .. tostring(v))
end
io.write("\n")
end
local function run()
local arr = {9, 4, 5, 7, -2, -1, 0}
print(arr)
quick_sort(arr, 1, #arr)
print(arr)
end
run()
posted on
浙公网安备 33010602011771号