kehuadong

快速排序, 寻找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));
}

 

posted on 2024-08-31 11:01  kehuadong  阅读(11)  评论(0)    收藏  举报

导航