c - 快速排序结构数组 : incorrect sort

标签 c quicksort structure

我在使用以下 VS 2010 代码时遇到问题。我正在尝试对结构数组进行排序。代码编译无误,速度很快,但存在排序结果不正确的问题。

我按“zip”字符串排序(出于测试目的,不是按数字,而是按字符比较)。我有一个使用标准库 qsort 运行的版本,但想做一些进一步的调整,所以我自己写。

 struct address {

  char name[40];
  char street[40];
  char city[20];
  char state[30];
  char zip[21];
};


void qs_struct(struct address items[], int left, int right)
{

  int i, j;
  char *x;
  struct address temp;

  i = left; 
  j = right;
  x = items[(left+right)/2].zip;

  do {
      while((strcmp(items[i].zip,x) < 0) && (i < right)){ i++;}
      while((strcmp(items[j].zip,x) > 0) && (j > left)) { j--;}

    if(i <= j) {
      temp = items[i];
      items[i] = items[j];
      items[j] = temp;
      i++; j--;
    }
  } while(i <= j);

  if(left < j) qs_struct(items, left, j);
  if(i < right) qs_struct(items, i, right);
}


void qx(struct address items[], int count)
{
  qs_struct(items,0,count-1);
}

void fillStructWithRandomDataForTest(struct address *addr, int i, int j)
{
    char temp[444];


            sprintf(temp, "%d%d", j +i, j*i);
            strcpy(addr->name, temp);
            sprintf(temp, "%d%d", j +i, j*i);
            strcpy(addr->street, temp);

            sprintf(temp, "%d%d", j +i, j*i);
            strcpy(addr->city, temp);
            sprintf(temp, "%d%d", j +i, j*i);
            strcpy(addr->state, temp);

            sprintf(temp, "%d%d", j +i, j*i);
            strcpy(addr->zip, temp);

}

 void xqs(void)
  {
  struct address addrs[20];

   for (int i = 0, j = 33; i < 16; ++i, --j)
        fillStructWithRandomDataForTest(&addrs[i], i, j);

    qx(addrs, 16);

    // results: incorrectly sorted
    for (int k = 0; k < 16; ++k)
        printf("%s \n",addrs[k].zip);

 }

最佳答案

如果您能准确地告诉我们您的结果不正确的方式,那就太好了,但这没关系,让我猜猜:它什么都不打印,对吧?全是空行,嗯?

代码中的最后一个循环使用 k 作为循环计数器,但随后它使用 i 作为索引来选择一个结构到 printf()。这将始终选择尚未初始化的 addrs[16]

你需要咖啡。或者 sleep 。但不是两者。

关于c - 快速排序结构数组 : incorrect sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690494/

相关文章:

asp.net-core - Net core MVC 整洁的架构,没有存储库模式

c++ - 带邻接表的 Dijkstra 算法

c - 为什么 gcc 可以自动将符号标记为弱

c - printf ("%.d", 0) 和 printf ("%.1d", 0) 有什么区别?

algorithm - 没有数据类型的快速排序算法

javascript - 输入的初始排序如何影响 Array.sort 性能?

c - 在 Visual Studio 2017 调试器中查找 NaN 出现的根源

c - 为什么我使用管道的代码挂起?

c - 在C中按行对由数据结构组成的矩阵进行排序

c - 结构中的字段取随机值