注册 登录
编程论坛 数据结构与算法

求一个排序算法的思路,关于文本文件的

newid_55 发布于 2016-10-24 07:22, 1853 次点击
一个txt文件,假如有200条记录,举例说:

计算机科学
链表算法
算法
文本段
.......

每一行只有几个字,比如6个,5个,2个,1个等等,一条记录占一行。

现在想把这200条无序的记录按照字段的长度由小到大进行重新排序,比如上面的排序后得到:

算法
文本段
链表算法
计算机科学
....

然后再把这个排序后的结果存储到另一个txt文件中,求算法思路,越具体越好,谢谢了!
3 回复
#2
书生牛犊2016-10-24 15:03
首先是O(N)的时间把所有数据读入。这我相信是所有算法都必须经历的。

其次,因为你这个场景不会涉及到数据增减,仅仅是把数据排序后重新写入原文件。并且数据规模不大(只有200)
可选的排序算法太多,快排、归并、堆排、。。。O(NlogN)
甚至是插入、冒泡都能完成O(N^2)

最后的输出又是一个O(N)。
#3
xzlxzlxzl2016-10-24 18:48
楼上的版主大大好高深啊!看不懂。
楼主此题估计用c++的string类好做些。
#4
word1232016-10-24 22:55
//冒泡排序。效率可能不是很高

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char arr[200][15];
int hang=0;

void readData(){
    FILE *fp;
    if((fp=fopen("1.txt","r"))==NULL){
        printf("file open error!!\n");
        exit(0);
    }
    while(!feof(fp)){
        fscanf(fp,"%s",arr[hang++]);
        if(strlen(arr[hang-1])==0)
        {
            hang--;
            break;
        }
    }
    fclose(fp);
}

void writeData(){
    FILE *fp;
    if((fp=fopen("2.txt","w"))==NULL){
        printf("file open error!!\n");
        exit(0);
    }
    int i=0;
    while(i<hang){
        fprintf(fp,"%s\n",arr[i]);
        i++;
    }
    fclose(fp);
}

void rank(){
    char ch[15];
    char (*p)[15]=arr;
    for(int i=0;i<hang-1;i++){
        for(int j=0;j<hang-1-i;j++){
            if(strlen(p[j])>strlen(p[j+1])){
                strcpy(ch,arr[j]);
                strcpy(arr[j],arr[j+1]);
                strcpy(arr[j+1],ch);
            }
        }
    }
}

int main()
{
    readData();
    rank();
    writeData();
    return 0;
}
1