2014-09-24 2 views
3
#include<stdio.h> 
int main(){ 
int a[9],i,j,r,t,min,c=0; 
for(r=0;r<9;r++) 
    scanf("%d",&a[r]); 

for (j=0;j<9;j++) { 
    min=a[j]; 
    for(i=j;i<9;i++) { 
     if(a[i] < min) { 
      c=i; 
      min=a[i]; 
     } 
    } 
t=a[j]; 
a[j]=min; 
a[c]=t; 
} 

for(r=0;r<9;r++) 
    printf("%d",a[r]); 
} 

Это код, который я должен упорядочить по номерам, введенным пользователем в порядке возрастания. Если вход 1 2 3 2 4 1 5 6 3 выход 1 1 2 2 3 3 4 5 6, но я хочу, чтобы результат был 1 2 3 4 5 6 т. Е. Дубликаты записей удалены. Пожалуйста, помогите мне.размещение номеров с дублирующимися записями удалено

+2

Первое, что вы должны заботиться о: код отступы – DonCallisto

+1

Затем сортируют, а затем выбрать несколько из них в один проход. –

+1

Подсказка: если я только что напечатал это число, не нужно печатать его снова. – user189

ответ

1

Если задан диапазон чисел, вы можете сделать это с помощью булевого массива, который будет хранить 1 в соответствующем индексе элемента.

#include <stdio.h> 
#include <stdbool.h> 
#define NUM_RANGE 10 

int main(){ 
    int num; 
    bool freq[NUM_RANGE + 1] = {0}; 
    for(int r = 0; r < 9; r++){ 
     scanf("%d",&num); 
     freq[num] = 1; 
    } 

    for (int i = 0; i < NUM_RANGE + 1; i++) 
     if(freq[i]) 
      printf("%d ", i); 

} 
1
#include<stdio.h> 

int main(){ 
    int a[] = {1, 2, 3, 2, 4, 1, 5, 6, 3}; 
    int n = sizeof(a)/sizeof(*a); 
    int i, j, t; 

    for (j=0;j<n-1;j++){ 
     for(i=j+1;i<n;){ 
      if(a[i] == a[j]){ 
       t = a[i]; 
       a[i] = a[--n]; 
       a[n] = t; 
       continue; 
      } 
      if(a[i] < a[j]){ 
       t = a[i]; 
       a[i] = a[j]; 
       a[j] = t; 
      } 
      ++i; 
     } 
    } 
    for(i=0;i<n;i++) 
     printf("%d ", a[i]); 
    return 0; 

} 
0

Таким образом, это процедура, которую вы можете следовать.

  1. Вы сортируете свой массив (как вы уже сделали). Ваш алгоритм сортировки имеет O (n^2) наихудшее время выполнения, где n - количество элементов в вашем массиве. Если вам интересно время работы, оптимальное время работы, которое может быть достигнуто, - O (n logn) [MergeSort].

  2. Далее мы должны найти дубликаты и удалить их. Поскольку вы уже заказывали, чтобы они просто перебирали ваш массив и проверяли, что каждое число a [i] и следующее число [i + 1] отличаются. Если это не так, удалите его и заполните пустое пространство, переместив все остальные массивы вперед.

Итак:

for(i = 0; i < 9; i++){ 

    if(a[i] == a[i+1]){ 
     deletNumber(i); //deletes number at position i in the array and shifts the 
         //rest of the array so the empty space is filled. 
    } 
} 

void deleteNumber(int i){ 
    int j; 

    for(j = i; j<8; j++){ 

    a[j] = a[j++]; 
    } 
} 
+1

Ваш пример кода неправильный (и плохой). – BLUEPIXY

+0

У вас есть объяснение для вашего заявления? – XerXes

+0

Он имеет квадратичную временную сложность (т. Е. Плохое) и вызывает неопределенное поведение (т. Е. Неправильное). – user58697

Смежные вопросы