やっとデバッグしたハッシュバケツ挿入ソート貼る
とりあえずやり切った、挿入ソートの部分を大きくすると時間がのびた所までは確認した、きたない
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> struct NVtab { int num; struct NVtab *next; }; enum { INIT = 4096, GROW = 2 }; char* fileGetLine(FILE*); static int endofline(FILE*, int); void mysort(int*,int); int main(int args, char *argv[]) { int i; char *line = NULL; int *nums = NULL; FILE *f; if(argv[1] == NULL) { f = stdin; } else if((f = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "ファイルがないよ\n"); exit(1); } for (i = 0; (line = fileGetLine(f)) != NULL; i++) { nums = realloc(nums, sizeof(int) * (i+1)); nums[i] = atoi(line); free(line); } if(argv[1] != NULL) { fclose(f); } mysort(nums, i); free(nums); return 0; } int hash(int num, int nhash) { int temp; temp = ((double)num / INT_MAX) * (nhash - 1); return temp; } void mysort(int *nums, int len) { int i, j; int h; int maxchain; int maenum; int nhash; struct NVtab **val; struct NVtab *newchain; struct NVtab *tmpchain; struct NVtab *nextchain; nhash = 1000 * 1000 * 10; val = (struct NVtab**)malloc(sizeof(struct NVtab*) * nhash); for(i = 0; i < nhash; i++) { val[i] = NULL; } for(i = 0; i < len; i++) { h = hash(nums[i],nhash); newchain = (struct NVtab*)malloc(sizeof(struct NVtab)); if(val[h] == NULL) { newchain->next = NULL; val[h] = newchain; } else if(val[h]->num > nums[i]) { newchain->next = val[h]; val[h] = newchain; } else { nextchain = val[h]->next; for(tmpchain = val[h]; tmpchain != NULL; tmpchain = tmpchain->next) { if(nextchain == NULL) { newchain->next = NULL; tmpchain->next = newchain; break; } if(nums[i] <= nextchain->num) { newchain->next = tmpchain->next; tmpchain->next = newchain; break; } nextchain = nextchain->next; } } newchain->num = nums[i]; } maenum = -1; for(i = 0; i < nhash; i++) { for(tmpchain = val[i]; tmpchain != NULL; tmpchain = tmpchain->next) { if(!(maenum <= tmpchain->num)) { fprintf(stderr,"%d\n", j); for(tmpchain = val[i]; tmpchain != NULL; tmpchain = tmpchain->next) { fprintf(stderr,"%d\t%d\n", j, tmpchain->num); } exit(1); } maenum = tmpchain->num; printf("%d\n",tmpchain->num); } } } char* fileGetLine(FILE *fin) { int i, c; int maxline = INIT; char *line = (char*)malloc (sizeof(char) * maxline); for (i = 0;(c = getc(fin)) != EOF && !(endofline(fin, c)); i++) { if (i > maxline) { maxline *= GROW; line = (char*) realloc(line, sizeof(char) * (maxline + 1)); } line[i] = (char)c; line[i+1] = '\0'; } return (c == EOF && i == 0) ? NULL : line; } static int endofline(FILE *fin, int c) { int eol; eol = (c == '\r' || c == '\n'); if (c == '\r') { c = getc(fin); if (c != '\n' && c != EOF) { ungetc(c, fin); } } return eol; }