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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值