【问题标题】:Integer pointer array sorting in CC中的整数指针数组排序
【发布时间】:2014-01-28 00:44:24
【问题描述】:

我有一个全局整数指针数组,就是这样创建的

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

这是什么原因造成的?我完全迷路了。

【问题讨论】:

  • sizeof 不符合您的预期,您需要size 作为循环条件。
  • sizesizeOfArray 是否具有相同的值?
  • @kajacx No. size 是 16,sizeOfArray 是 4。我的目标是用 16 个值对数组的 4 个第一个值进行排序。我会更新问题
  • 你能发布复制问题的可编译代码吗?
  • 在代码中放一个 printf() 就可以看到了。

标签: c arrays algorithm sorting


【解决方案1】:

这是您的代码,用于制作 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 的定义移到分配之前。

【讨论】:

    【解决方案2】:

    我相信这将适用于您的排序数组...在第二次迭代中 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;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      希望对你有所帮助。

      【讨论】:

      • 其实这不是冒泡排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2015-06-11
      • 1970-01-01
      • 2016-07-21
      • 2016-07-24
      相关资源
      最近更新 更多