去掉整数并排序(非链表版)

需求:给定一个整数序列,KiKi想把其中的重复的整数去掉,并将去重后的序列从小到达排序输出。

第一行,输入一个整数n,表示序列有n个整数。

第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。 

输入:

6
5 3 3 4 2 2

输出:

2 3 4 5

分析:

动态数组的划分,和冒泡排序保证从小到大。

题干给我们重要提示要求所有数字非0,所以说就可以采取重复化0法来完成题目

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n;
    scanf("%d", &n);
    int* p = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        scanf("%d", p + i);
    }//数组创建完毕
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (p[j] > p[j + 1])
            {
                int temp = p[j];
                p[j] = p[j + 1];
                p[j + 1] = temp;
            }
        }
    }//冒泡排完序确保从小到大排列
    for (int i = 0; i < n; i++)
    {
        int gel = p[i];
        if (p[i] == 0)//说明已经被删除
            continue; //直接跳过循环
         else 
            for (int j = i + 1; j < n; j++)
            {
                if (p[j] == gel) //出现重复就判断为0
                    p[j] = 0;
            }
    }
    //删除重复后得到的是一个从小到大有序排列的一个数组
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        if (p[i] != 0)
            sum++;
    }//求出来新数组的大小
    int* arr = (int*)malloc(sum * sizeof(int));
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        if (*(p + i) != 0)
        {
            *(arr + j) = *(p+i);
            j++;
        }
    }
    for (int i = 0; i < sum; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

感谢大家的点赞!

一起进步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值