快速排序
#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;
}