2017-03-31 64 views
2

我編寫了一個對數組值進行排序的程序。它有5個陣列,如何在指針數組中傳遞完整數組

int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 5 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

和指針數組保持那些5個陣列,

int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 }; 

欲每個陣列的值進行排序,但是當我通過陣列排序功能

sortArrValues(&pArr[i]); 

它看到每個陣列(arr1arr2 ...)作爲陣列(pArr[i])的元件的第一索引,所以pArr[i]是(3,2,0,1,4)。
但我想pArr[i]是它的意思,因此在第一次迭代pArr[i]將是(3,9,6,7)。

:每個陣列的第一索引指示數組(不包括該索引)的長度。
排序將跳過第一個索引。
還有兩個額外的功能,他們沒有使用(你可以跳過它們)。

下面是完整的代碼:

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

#define LEN 5 

void sortArrValues(int** arr); 
void sortArrAdress(int* pArr); 
void printArr(int * pArr); 

int main() 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 5 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 }; 

    int i = 0; 

    for (i = 0; i < LEN; i++) 
    { 
     sortArrValues(&pArr[i]); 
    } 

    //sortArrAdress(pArr); 
    //printArr(pArr); 

    return 0; 
} 
/* 
this function will sort the given arrays' values. 
in: array 
out: none 
*/ 
void sortArrValues(int** arr) 
{ 
    int tmp = 0; 
    int i = 0; 

    for (i = 1; i < *arr; i++) 
    { 
     if (*arr[i] > *arr[i+1]) 
     { 
      tmp = *arr[i]; 
      *arr[i] = *arr[i + 1]; 
      *arr[i + 1] = tmp; 
     } 
    } 
} 
+0

我認爲它崩潰? – StoryTeller

+0

@StoryTeller不,它只是迭代由每個數組的第一個索引組成的假數組(3,2,0,1,4)。 – Ma250

+6

也許對*運算符優先級*的評論會有所幫助? '* arr [i]' - >'(* arr)[i]'? –

回答

1

。在你的代碼中的一些錯誤。

首先,您不需要發送&pArr[i],pArr[i]就足以訂購您的陣列。那麼你的void sortArrValues(int** arr)變得void sortArrValues(int* arr)這是更清晰的閱讀。第二,在你的sortValues中,當你改變一個值的時候,你應該重新啓動(我知道這並不是非常優化的,但是如果你想讓某些東西真的更快,你應該使用代碼快速排序,{ 4, 5, 6, 2, 1 } 。將成爲{ 4 5 2 1 6 }

所以這是你的代碼的修復程序:。

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

#define LEN 5 

void sortArrValues(int* arr); 
void sortArrAdress(int* pArr); 
void printArr(int * pArr); 

int main() 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 5 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 }; 

    int i = 0; 

    for (i = 0; i < LEN; i++) 
    { 
     sortArrValues(pArr[i]); 
    } 

    //sortArrAdress(pArr); 
    //printArr(pArr); 

    for (int i = 0 ; i < LEN ; i++) { 
     for (int j = 0 ; j < pArr[i][0] + 1 ; j++) 
      printf("%d ", pArr[i][j]); 
     printf("\n"); 
    } 

    return 0; 
} 
/* 
this function will sort the given arrays' values. 
in: array 
out: none 
*/ 
void sortArrValues(int* arr) 
{ 
    int tmp = 0; 
    int i = 0; 

    for (i = 1; i < *arr; i++) 
    { 
     if (arr[i] > arr[i+1]) 
     { 
      tmp = arr[i]; 
      arr[i] = arr[i + 1]; 
      arr[i + 1] = tmp; 
      i = 0; 

     } 
    } 
} 
+0

你應該確定是否需要任何其他的排序程序,事實上直到你有幾百個元素,它不會有任何可衡量的差異。從C庫中使用'qsort'很難勝任。它使用混合合併和快速排序,可以高效地處理大型和小型數組。 –

+0

@ DavidC.Rankin已經是我的回答,爲了獲得更好的性能,他應該使用快速排序算法。 –

+0

這不是我的觀點。關鍵是,直到你有幾百個元素,你使用什麼類型都沒關係。你說得對,quicksort可以提供很多優點,但是它也有很多缺點,讓新手試圖自己寫。更好地引導他們到'qsort'這是標準庫的一部分,並且已經在其中進行了多年的優化和驗證。 –

0

我試圖修改你的程序來解決問題,其中有些問題已經被別人強調有一些有沒有。這裏是工作片段,讓我知道你是否需要更多的解釋我只修改了你的sort函數。這個想法不是給你最快的排序算法,而是一個工作的算法。

int main() 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 5 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int* pArr[] = { arr1, arr2, arr3, arr4, arr5 }; 

    int i = 0; 

    for (i = 0; i < LEN; i++) 
    { 
     sortArrValues(&pArr[i]); 
    } 
} 


void sortArrValues(int** arr) 
{ 
    int tmp = 0; 
    int i = 0, j = 0; 

    for (i = 0; i < (**arr) - 1; i++) 
    { 
     for(j=i+1; j < (**arr) - 1; j++) { 
      if ((*arr)[i+1] > (*arr)[j+1]) 
      { 
       tmp = (*arr)[i+1]; 
       (*arr)[i+1] = (*arr)[j + 1]; 
       (*arr)[j+1] = tmp; 
      } 
     } 
     printf("%d ", (*arr)[i+1]); 
    } 
    printf("%d\n", (*arr)[i+1]); 
} 
+0

只是一個答案的指針(不是批評)。在回答時,請嘗試解釋邏輯和推理中的錯誤所在,並告知OP如何正確處理類型問題。說「這是一個工作片段」,沒有分析,雖然有幫助,卻錯過了一個機會來幫助教育未來的C程序員。誰知道,你幫忙的人可能是下一個萊納斯 - 給他們一個很好的基礎。 –

+0

@ DavidC.Rankin,我同意你的建議。下次我會嘗試更具描述性。 – VHS