30/09/2018, 16:38

Chương trình sắp xếp một mảng theo thứ tự tăng dần sau khi đã loại bỏ các phần tử trùng nhau

Đề bài yêu cầu viết chương trình như tiêu đề. Còn đây là code mà mình đã làm

#include <stdio.h>
#include <conio.h>

void Nhap(int a[],int n)
{
    int i;
    for (i=0;i<n;i++)
    {
        printf("Phan tu thu %d: ",i+1);
        scanf("%d",&a[i]);
    }
}
void Inmang(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d",a[i]);
    printf("
");
}
void Sapxep(int a[],int n)
{
    int t,i,j;
    for(i=0;i<n-1;i++)
        for(j=1;j<n;j++)
            if (a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
}
void Xoa(int a[],int n)
{
    for(int i=0; i<n-1 ; i++)
        for(int j= i + 1; j < n; j++)
            if(a[i] == a[j])
            {
                for(int k = j; k < n; k++)
                    a[k-1] = a[k];
                n--;
            }
}

int main()
{
    int b[20],n;
    printf("So phan tu thuc te cua mang N= ");
    scanf("%d",&n);
    Nhap(b,n);
    printf("Mang vua nhap: ");
    Inmang(b,n);
    Xoa(b,n);
    Sapxep(b,n);
    printf("Mang sau khi sap xep: ");
    Inmang(b,n);
    getch();
    return 0;
}

http://codepad.org/PePiSxfW
Mọi người giúp mình với. Hàm xóa có bị sai chỗ nào ko

Gió viết 18:54 ngày 30/09/2018

K chạy từ j+1 chứ.
Theo mình bỏ cái for(k=…) đi. Khi xoá chỉ cần swap(a[j],a[n-1]) và giảm n thôi. Không cần phải giữ thứ tự mảng như ban đầu(cũng bị sắp xếp lại). Nó sẽ chạy nhanh hơn

Jacaré Junior viết 18:48 ngày 30/09/2018

GIẢ sử mảng có 10 phần tử thì ta sẽ dùng 9 cặp so sánh. Sau mỗi lần so sánh ta giảm đi 1 cặp…

Bài liên quan
0