【问题标题】:Sorting names by alphabetical order: more efficient way按字母顺序对名称进行排序:更有效的方法
【发布时间】:2015-01-04 15:27:12
【问题描述】:

我正在开发一个应用程序,其中一个函数是 sort_books 函数,它基本上必须按字母顺序对文件 fp 中的书籍名称进行排序,然后将书籍写入文件 fp2 并打印名称书籍按字母顺序进入控制台。

我的函数与冒泡排序算法完美配合,但要对 100000 本书进行排序大约需要 4 分钟,这实在是太长了。

有人知道我可以如何调整这段代码以提高效率和速度吗?

FILE *fp
FILE *fp2;

sort_books(){
struct book books[100000];
struct book b;

//open files

int i = 0;
while (!feof(fp)){

   fread(&b,sizeof(b),1,fp);

       if(feof(fp))
    {
        break;
    }   

    books[i] = b;
        i++;        
}

//number of books in the file
int len = i;

//bubble sort;
int j = 0;

//Bubble sort: sorting algorithm
    for(i=0; i<len; i++)
    {
        for(j=0; j<len-1; j++)
        {
           //If the first book should come after the next book in the array
           if(strcmp(books[j].name, books[j+1].name) > 0)
        {
            //swap the books
            struct book temp;
            temp = books[j];
            books[j] = books[j+1];
            books[j+1] = temp;
        }
        }
    }

    //now write each book in the array "books" into the file one by one
    int z;
    for(z=0; z<len; z++)
    {   
        fwrite(&books[z],sizeof(books[z]),1,fp2);
        //test console
        printf("Name: %s \n", books[z].name);
    }

    //close files

    }

【问题讨论】:

  • 尝试快速/合并排序?
  • 这个问题属于codereview.stackexchange.com
  • 几乎你发现的任何排序都比冒泡排序更有效。即使需要就地排序,单步遍历列表,找到最小值并将该值交换到第一个位置,然后从第二个元素开始重复,等等,它也更快,也更容易;这涉及移动的数据量(平均而言)仅为冒泡排序的一半。
  • 不相关,但不要使用while (1feof(fp)),它不会像你预期的那样工作,因为EOF 标志直到你尝试从其他地方读取之后才会设置文件的结尾。这意味着您将循环一次到多次迭代。相反,例如while (fread(...) == sizeof(b))
  • @Zombie :查看我的更新答案。如果这能回答您的问题,请告诉我。

标签: c sorting alphabetical


【解决方案1】:

冒泡排序是 O(n^2)。你可以试试 Quicksort,它是 O(nlogn)。从本质上讲,大多数排序算法都比您演示的冒泡排序更快。

有关最常见的排序方法的列表、它们的动画以及它们的实现,请参阅以下页面:

http://www.sorting-algorithms.com/

【讨论】:

  • 谢谢史蒂夫!我将尝试实现快速排序算法。
  • @Zombie 快速排序在已排序的数据上为 n^2,您可能需要考虑,为了获得良好的一致性,您需要先进行随机播放,这使其成为最佳情况 (n log n) (包含在图中)...大多数标准库也有一个 qsort 函数...
  • @GradyPlayer 是的,快速排序最坏的情况是 n^2
  • @steve 我要说的一点是,尽管其他排序算法有一个病态的输入......快速排序存在已排序数据和几乎排序数据的问题,这是一种常见情况。 ..
  • @GradyPlayer 我明白了。没错。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多