C中的整数指针数组排序

时间:2014-01-28 00:44:25

标签: c arrays algorithm sorting

我有一个全局整数指针数组,以这种方式创建

int * array;
array = (int *) malloc(size * sizeof(int));

我还有一个排序算法,它应该排序4个大小大于4的数组的第一个数字(在这种情况下为16)。在这种情况下,sizeOfArray定义为4:

int temp,i,j;
for(i=0;i<sizeOfArray;i++){
    for(j=i;j<sizeOfArray;j++){
        if(array[i] > array[j]){
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
        }
    }
}

出于某种原因输出真的很奇怪:

Unsorted: 7,6,9,3
Sorted:  3,6,5,1

最奇怪的部分是如果我改变算法以降序排序数字,它似乎有效:

if(array[i] < array[j])

Unsorted: 10,0,1,8
Sorted: 10,8,1,0

造成这种情况的原因是什么?我完全迷失了。

3 个答案:

答案 0 :(得分:2)

以下代码包装为制作MCVE How to create a Minimal, Complete, Valid Example?

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

static void print(int n, int a[n])
{
    for (int i = 0; i < n; i++)
        printf("%2d", a[i]);
    putchar('\n');
}

int main(void)
{
    int size = 16;
    int *array = (int *) malloc(size * sizeof(int));

    array[0] = 7;
    array[1] = 6;
    array[2] = 9;
    array[3] = 3;
    int sizeOfArray = 4;

    printf("Before:");
    print(sizeOfArray, array);

    int temp, i, j;
    for (i = 0; i < sizeOfArray; i++)
    {
        for (j = i; j < sizeOfArray; j++)
        {
            if (array[i] > array[j])
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

    printf("After: ");
    print(sizeOfArray, array);

    return 0;
}

该程序的输出是:

Before: 7 6 9 3
After:  3 6 7 9

由于这与您获得的输出不同,因此必须存在差异 - 这是一个至关重要的区别。由于您没有显示初始化数组的代码,也没有显示演示前4个元素具有未排序值的代码,也没有显示演示排序值的代码是不可靠的,因此无法确定是错的 - 但问题不在你展示的代码中。

我没有修复代码来检查内存分配是否成功;我也没有修改代码来释放分配的空间。两者都应该完成。

代码确实使用C99功能;修改它是不容易的:

static void print(int n, int *a)
{
    int i;
    for (i = 0; i < n; i++)

并在分配前移动sizeOfArray的定义。

答案 1 :(得分:0)

让我们使用您提供的值对代码进行一些迭代:7,6,9,3。另外,我们假设sizeOfArray = 4。 对于i = j,您的条件永远不会被执行,因为array[i] = array[j]

i = 0j = 1 =&gt; 7 > 6 =&gt; array = {6, 7, 9, 3} 对于i = 0j = 2 =&gt; 6 < 9 =&gt; array = {6, 7, 9, 3} 对于i = 0j = 3 =&gt; 6 > 3 =&gt; array = {3, 7, 9, 6}

i = 1j = 2 =&gt; 7 < 9 =&gt; array = {3, 7, 9, 6} 对于i = 1j = 3 =&gt; 7 > 6 =&gt; array = {3, 6, 9, 7}

i = 2j = 3 =&gt; 9 > 7 =&gt; array = {3, 6, 7, 9}

因此,我获得了正确排序的数组的四个第一个元素(包含size元素,我假设size = 16)。

如果您不确定sizeOfArraysize的价值,我建议您打印它们,并检查它是否真的是您想要的价值。

希望这会对你有所帮助。

答案 2 :(得分:0)

我相信这对你的排序数组有用......在第二次迭代中,sizeofarray-1适用于循环j ...

int temp,i,j;
for(i=0;i<sizeOfArray;i++)
{
    for(j=0;j<sizeOfArray-1;j++)
    {
        if(array[i] > array[j])
        {
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
        }
    }
}