#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();
}
假设我们有10万条URL访问日志,如何按照访问次数给URL排序?
最新推荐文章于 2024-05-21 20:29:42 发布