将C中内置qsort()函数的值赋给另一个数组

时间:2014-12-17 02:53:36

标签: c arrays sorting quicksort

我正在尝试使用C中的内置qsort()函数对数组进行排序。以下是我写的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main(void) {
    int size,i;
    printf("Enter the size of strings:\n");
    scanf("%d", &size);

    int a[size],identity[size];

    printf("***********************************************************\n");
    printf("Enter the first string:\n");
    for(i=0;i<size;i++)
        scanf("%d", &a[i]);


    printf("Before sorting A is: \n");
    for( i = 0 ; i < size; i++ ) {
      printf("%d ", a[i]);
    }

    identity = qsort(a, size, sizeof(int), cmpfunc);

   printf("\nAfter sorting the list is: \n");
   for( i = 0 ; i < size; i++ ) {
      printf("%d ", identity[i]);
   }


    return 0;
}

由于我来自Python编程实践,我不了解如何使名为 identity 的数组保持已排序数组a的值,我相信这是qsort()的输出

非常感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:3)

qsort没有返回任何内容,它只是就地对阵列进行排序。原型开头的void返回类型指定缺少返回值:

void qsort(void *arr, size_t num, size_t sz, int (*fn)(const void*, const void*));

因此你称之为:

qsort (a, size, sizeof(int), cmpfunc);

并且“返回值”是数组a本身,根据您传入的参数进行排序。

这意味着你最后没有原始数组,除非你先复制它。如果你真的需要一个新的排序数组(这是不寻常的),你可以使用类似的东西:

int *identity = malloc (size * sizeof(int));
if (identity == NULL)
    complainBitterlyAndExit();
memcpy (identity, a, size * sizeof(int));
qsort (identity, size, sizeof(int), cmpfunc);

// Now have original a and sorted identity.
// Need to free (identity) at some point.

答案 1 :(得分:1)

在默认的qsort函数中返回void,因此您使用以下代码

qsort(a,size,sizeof(int),cmpfunc);

    printf("\nAfter sorting the list is: \n");
    for( i = 0 ; i < size; i++ ) {
            printf("%d ", a[i]);
    }