C语言实现快速排序

快速排序
#include <stdio.h>
#include <stddef.h>

void swap(int * a, int * b) {
  int tmp = * a;
  * a = * b;
  * b = tmp;
}
// partition 作用是将基值移动到中间位置, 使得左边的值都比基值小, 右边的值都比基值大
// pivot_i: 基值的位置

size_t partition(int * ary, size_t len, size_t pivot_i) {
  size_t i = 0;
  size_t small_len = pivot_i; // 比基值小的位置,随着数量的增加而右移
  int pivot = ary[pivot_i]; // 基值
  swap(&ary[pivot_i], &ary[pivot_i + (len - 1)]);// 先将基值移动到尾部
  for (; i < len; i++) { // 循环交换比基值小的值到 基值座标(small_len)左面
    if (ary[pivot_i + i] < pivot) {
      swap(&ary[pivot_i + i], &ary[small_len]);
      small_len++;
    }
  }
  swap(&ary[pivot_i + (len - 1)], &ary[small_len]);// 最后将基值交换回到所有小于基值数列的右边, 完成分区
  return small_len;
}

void quick_sort(int * ary, size_t len) {
  if (len == 0 || len == 1) return;
  size_t small_len = partition(ary, len, 0);// 取到分区的座标
  quick_sort(ary, small_len); // 将左分区排序
  quick_sort(&ary[small_len + 1], len - small_len - 1);// 将右分区排序
}

int main(void) {
  int ary[] = {2,4,2,5,3,5,3,1,7,6};
  size_t len = sizeof(ary) / sizeof(ary[0]);
  quick_sort(ary, len);
  return 0;
}




点赞