2014-01-28 95 views
1

我有一個全球性的整數指針數組,其中創建這樣整數指針數組排序用C

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 

這是什麼原因造成的?我完全失去了。

+1

的sizeof不會做你想要什麼,你需要'size'作爲循環條件。 – wildplasser

+0

'size'和'sizeOfArray'具有相同的值嗎? – kajacx

+2

@kajacx編號'size'爲16,'sizeOfArray'爲4.我的目標是用16個值對數組的4個第一個值進行排序。我將更新問題 – Avaruusmuikku

回答

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定義。

0

讓我們用您提供的值做一些代碼迭代:7,6,9,3。另外,我們假設sizeOfArray = 4。 對於i = j,您的條件將永遠不會執行,因爲array[i] = array[j]

對於i = 0j = 1 =>7 > 6 =>array = {6, 7, 9, 3} 對於i = 0j = 2 =>6 < 9 =>array = {6, 7, 9, 3} 對於i = 0j = 3 =>6 > 3 =>array = {3, 7, 9, 6}

對於i = 1j = 2 =>7 < 9 =>array = {3, 7, 9, 6} 對於i = 1j = 3 =>7 > 6 =>array = {3, 6, 9, 7}

i = 2對於和j = 3 =>9 > 7 =>array = {3, 6, 7, 9}

因此,我你獲得陣列正確排序的四個第一元件(其含有size元素和我假定size = 16)。

如果您不確定sizeOfArraysize的價值,我建議您打印它們並檢查它是否真的是您想要的值。

希望這可以幫助你。

+0

實際上,這不是冒泡排序。 –

0

我相信這會爲你的排序陣列工作...在第二次迭代sizeofarray-1將用於循環Ĵ工作...

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; 
     } 
    } 
}