繁体   English   中英

按字符串排序结构数组

[英]Sorting an array of structs by string

我正在尝试使用选择排序和指针对结构数组进行排序,但我遇到了一些麻烦。

当我尝试打印数组以查看名称是否已排序时,所有名称都被排序,除了第一个位置中的名称保持原样(未排序)。

/*
   all is the unordered array of struct; pLast is pointer to the last struct in array.
*/
void sortArray(CASE* all, CASE* pLast)
{
  CASE* current;
  CASE* walker;
  CASE* smallest;
  CASE temp;


  for(current = all; current < pLast; current++)
  {
    smallest = current;

    for (walker = current + 1; walker <= pLast; walker++)
    {
      if(strcmp(walker->name, smallest->name) < 0 )
        smallest = walker;
    }
    temp = *current;
    *current = *smallest;
    *smallest = temp;
  }

  for(walker = all; walker <= pLast; walker++)
  {
    printf("%s\n", walker->name);
  }  

  return;
}

有小费吗?

谢谢

编辑:主要修订版,允许打印名称,但不完全排序

作为一个简单的算法,选择排序看起来总是这样:

function selection_sort(arr):
  for i in 0..len(arr)-1:
    smallest = i
    for j in i+1..len(arr)-1:
      if arr[j] < arr[smallest]:
        smallest = j
    swap i and smallest.

如果使用指针,实现仍将使用此格式(或非常接近)。

仅供参考: http//en.wikipedia.org/wiki/Selection_sort

有没有理由不使用qsort?

不幸的是你没有写出struct CASE*是什么; 我们只知道它包含一个字段名称

所以你可以写一个比较函数,如:

int case_struct_comparison_function (const void * v1, const void * v2) {
  const struct CASE * case_1 = v1;
  const struct CASE * case_2 = v2;
  return  strcmp(case_1->name, case_2->name);
}

qsort(arr, size_of_arr, sizeof(struct CASE), case_struct_comparison_function);

这是未经测试但应该给你一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM