快速排序, 寻找k_th元素
common.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define ASIZE(a) (sizeof(a)/sizeof(a[0]))
static inline void rand_array(int* a, int size)
{
for (int i = 0; i < size; i++)
{
a[i] = rand();
}
}
static inline void print_array(int* a, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d, ", a[i]);
}
printf("\n");
}
k_th_element.c
// 寻找k_th元素
#include "common.h"
static int split(int* a, int first, int last)
{
// 2024/8/31 10:36
int i = first;
int j = last;
while (i < j)
{
// 在左边寻找大于a[0]的位置
while (i < j && a[i] <= a[first])
{
i++;
}
// 在右边寻找小于等于a[0]的位置
while (a[j] > a[first])
{
j--;
}
// 交换上述两位置的元素, 这样a[i] <= a[0], a[j] > a[0]成立了
if (i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
if (j != first)
{
int temp = a[j];
a[j] = a[first];
a[first] = temp;
}
return j;
// 2024/8/31 13:27
}
void KE_qsort(int* a, int size)
{
// 202/8/31 10:45
if (size > 1)
{
int s = split(a, 0, size-1);
KE_qsort(a, s);
KE_qsort(a+s+1, size-s-1);
}
// 2024/8/31 11:59
}
// k: first0
int k_th_element(int* a, int size, int k)
{
int s;
int first = 0;
int last = size-1;
while ((s = split(a, first, last)) != k)
{
// k在s左边
if (k < s)
{
last = s-1;
}
// k在s右边
else
{
first = s+1;
}
}
return a[k];
}
int main()
{
// 随机
int a[10];
rand_array(a, ASIZE(a));
print_array(a, ASIZE(a));
// n元素
printf("%d\n", k_th_element(a, 10, 5));
// 排序
KE_qsort(a, 10);
print_array(a, ASIZE(a));
}
浙公网安备 33010602011771号