2013-06-26 33 views
0
void sort_int_array(int A[], int n) { 
    int i, j, h, k, O[n]; 
    /* assume that A[0] to A[n-1] have valid values */ 
    for (i=1; i<n; i++) { 
     /* swap A[i] left into correct position */ 
     for (j=i-1; j>=0 && A[j+1] <= A[j]; j--) { 
      int_swap(&A[j], &A[j+1]); 
      for (k=0; k<n; k++) { 
       for (h = 0; h < k; h++) { 
        if (A[k] == O[h]) { 
         break; 
        } 
        else { 
         O[k] = A[k]; 
        } 
       } 
      } 
     } 
    } 
} 

我試圖只從有序數組寫入不同的值到另一個數組。該函數的第一部分對數組進行排序,但是當我將它寫入到新數組時,它會返回排序數組並且不會刪除副本。只寫一個不同的值到一個數組

例如。輸入:4 5 6 7 6 5 4.輸出:4 4 5 5 6 6 7.

輸出想要的東西:4 5 6 7

+0

希望這是你有幫助 http://stackoverflow.com/questions/2826233/removing-duplicates-in-an-array-in-c –

+4

嘗試做排序和過濾分開,否則你的代碼變得很麻煩 –

+0

執行第一和第二for循環之外的第三和第四循環,應該做的工作。 – 0decimal0

回答

0

你可以試試這個方法。

  1. 排序陣列第一。 4 4 5 5 6 6 7
  2. 第一個元素總是不同的。將其複製到第二個數組中。
  3. 現在,從排序數組中的第二個元素開始,並在與第二個數組中存在的一個元素進行比較後複製。
  4. 如果對[i] ==輸出[j]進行排序,忽略或說增量i。
  5. 否則,複製ith元素到輸出數組,將j和i都加1
  6. 在完全遍歷已排序的數組時完成此操作。

這將這樣的伎倆。

int[] arr = {4,4,5,5,6,6,7}; 
    int out[]= {0}; // or may be some size 
    int i=1; 
    out[0] = arr[0]; 
    int j=0; 
    while(i<arr_length){ 
     if(arr[i]!=out[j]){ 
      out[++j]=arr[i]; 
     } 
     i++; 
    } 
    for(int k=0;k<out_length;k++){ 
     printf("%d,",out[k]); 
    } 
+0

非常奇怪在C回答中使用C++(或者至少看起來像C++,使用'new')。 – unwind

+0

感謝您的信息。現在編輯。其實我以前寫了一個Java代碼,並忘記改變 –

0
void sort_int_array(int A[], int n) { 
    int i, j, k, O[n]; 
    for(k=i=0; i<n; ++i){ 
     for(j=i+1;j<n;++j){ 
      if(A[j]<A[i]) 
       int_swap(&A[j],&A[i]); 
     } 
     if(i==0 || O[k-1] < A[i]) 
      O[k++]=A[i]; 
    } 
    printf("DEBUG:"); 
    for(i=0;i<k;++i) 
     printf("%d ", O[i]); 
    printf("\n"); 
} 
相關問題