概念

快速排序,就是先选定中心轴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 2025-03-16 18:34  Dylaris  阅读(33)  评论(0)    收藏  举报