假设我们有10万条URL访问日志,如何按照访问次数给URL排序?

#include <stdio.h>
#include <string.h>
#include "../uthash.h"

struct url {
    char element[10];
    int num;
    UT_hash_handle hh;
};

struct url *map = NULL;

struct url *get(char *url) {
    struct url *find;

    HASH_FIND_STR(map, url, find);
    return find;
}

void put(char *url) {
    struct url* find;
    find = get(url);
    if (find) {
        find->num++;
        return;
    }

    struct url* new_url;
    new_url = malloc(sizeof *new_url);
    strcpy(new_url->element, url);
    new_url->num = 1;
//    for (int i = 0; *(url + i) != '\0'; i++) {
//        new_url->element[i] = *(url + i);
//    }
    HASH_ADD_STR(map, element, new_url);
//    free(new_url);
}

int get_num(char *url) {
    struct url* find = get(url);
    if (find == NULL) {
        printf("%s not found, err!", url);
        return -1;
    }
    return find->num;
}

void free_all() {
    struct url *current_url, *tmp;

    HASH_ITER(hh, map, current_url, tmp) {
        HASH_DEL(map, current_url);  /* delete; users advances to next */
        free(current_url);             /* optional- if you want to free  */
    }
}

void swap(char *urls[], int i, int j) {
    char *temp = urls[i];
    urls[i] = urls[j];
    urls[j] = temp;
}

int partition(char *urls[], int start, int end) {
    int p = get_num(urls[end]);
    int i = start, j = start;
    for (; j < end; j++) {
        if (get_num(urls[i]) < p) {
            i++;
        } else {
            if (get_num(urls[j]) < p) {
                swap(urls, i, j);
            }
        }
    }
    swap(urls, i, j);
    return i;
}

void quick_sort(char *urls[], int start, int end) {
    if (start >= end) {
        return;
    }

    int p = partition(urls, start, end);
    quick_sort(urls, start, p - 1);
    quick_sort(urls, p + 1, end);
}

void url_sort(char *urls[], int len) {
    for (int i = 0; i < len; i++) {
        put(urls[i]);
    }
    quick_sort(urls, 0, len - 1);
}

void test_url_sort() {
    char *urls[1000] = {0};
    for (int i = 0; i < 500; i++) {
        urls[i] = "str1";
    }
    for (int i = 500; i < 800; i++) {
        urls[i] = "str2";
    }
    for (int i = 800; i < 1000; i++) {
        urls[i] = "str3";
    }
    url_sort(urls, 1000);
    for (int i = 0; i < 1000; i++) {
        printf("%s\n", urls[i]);
    }
    free_all();
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值