首页 > 试题广场 >

有序序列插入一个数

[编程题]有序序列插入一个数
  • 热度指数:11124 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解


有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。




输入描述:
共三行,
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。


输出描述:
输出为一行,N+1个有序排列的整数。
示例1

输入

7 
5 30 40 50 60 70 90
20

输出

5 20 30 40 50 60 70 90
这次用一个“开挂”的辅助工具——Set。Set是STL里面的容器之一,也就是集合。这个容器的性质可能和之前有道题应该有说过它和数学中的集合性质是一样的。Set容器和Multiset容器的区别在于Set不允许有重复的元素,这两个容器都是每输入一个元素进去,都会自动的帮你从小到大排好顺序。因此大大帮助我们省去了很多时间。最后如果第二次输入要插入的数后,如果这个数没有出现在容器里,那么你插入后它会自动对容器排序,就插入好了。否则插入不会成功!在末尾就用遍历的方式遍历整个容器里面的元素。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int N;
    set<int> s;
    cin >> N;
    for(int i = 0; i < N; i++){
        int num;
        cin >> num;
        s.insert(num);
    }
    int Num;
    cin >> Num;
    s.insert(Num);
    for(auto i : s){
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

发表于 2020-06-02 16:21:56 回复(1)
#include <stdio.h>
int main()
{
    int n;
    int a[55];
    int i;
    scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%d",&a[i]);
    int x;
    scanf("%d",&x);
    for(i=n;i>0;i--){
        if(a[i-1]>x){
            a[i]=a[i-1];
        }else{
            a[i]=x;
            break;
        }
    }
    if(!i) a[i]=x;
    for(i=0;i<=n;i++){
        if(i==n) printf("%d\n",a[i]);
        else printf("%d ",a[i]);
    }
}

发表于 2020-04-10 20:23:57 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *temp;
    int i, j, k, t, n;
    
    while (scanf("%d", &n) != EOF && (n >= 0 && n <= 50))
    {
        getchar();
        temp = (int *)malloc((n + 1) * sizeof(int));
        if (NULL == temp)
        {
            fprintf(stderr, "Memory allocation failed!\n");
            exit(EXIT_FAILURE);
        }
        for (i = 0; i < n; i++)
        {
            scanf("%d", &temp[i]);
        }
        getchar();
        scanf("%d", &j);
        getchar();
        for (i = 0; i < n; i++)
        {
            if (j <= temp[i])
            {
                for (k = n - 1; k >= i; k--)
                {
                    temp[k + 1] = temp[k];
                }
                temp[i] = j;
                break;
            }
        }
        if (i == n)
        {
            temp[i] = j;
        }
        for (i = 0; i < n + 1; i++)
        {
            printf("%d ", temp[i]);
        }
        free(temp);
        temp = NULL;
    }
    
    return 0;
}
//用动态内存分配的数组处理时可扩展性更好;
编辑于 2020-04-18 22:32:42 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            ArrayList<Integer> arrayList = new ArrayList<>();
            for (int i = 0; i < n + 1; i++) {
                arrayList.add(scanner.nextInt());
            }
            Collections.sort(arrayList);
            for (int i : arrayList) {
                System.out.print(i + " ");
            }
        }
        scanner.close();
    }
}

发表于 2021-10-16 00:26:00 回复(0)
#include<stdio.h>
int main(){
    int n,x;
    scanf("%d",&n);
    int a[n+1],m=n;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&x);
    for(int i=0;i<=n;i++)
        if(a[i]>x){
            for(;n>i;n--)
                a[n]=a[n-1];
                a[i]=x;
            break;
        }
    for(int i=0;i<=m;i++)
        printf("%d ",a[i]);
    return 0;
}

发表于 2021-04-09 17:22:48 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,in_num,x;
    cin>>n;
    int arr[n+1];
    for(int i = 0;i<n;i++){
        cin>>x;
        arr[i] = x;
        
    }
    getchar();
    cin>>in_num;
    arr[n] = in_num;
    sort(arr,arr+n+1);
    for(int j = 0;j<n+1;j++){
        cout<<arr[j]<<" ";
    }
}

发表于 2020-09-29 23:06:31 回复(0)
#include <iostream>
#
include <stdio.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int a[n + 1];
    int i = 0;
    
    while (i < n)
    {
        cin >> a[i];
        ++i;
    }
    
    int b;
    cin >> b;
    i = 0;
    
    while (i < n && a[i] < b)
        ++i;
    
    for (int j = n; j > i; --j)
        a[j] = a[j - 1];
    
    a[i] = b;
    
    for (i = 0; i <= n; ++i)
        cout << a[i] << " ";
        
    return 0;
}
发表于 2020-03-23 23:07:43 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cin>>a[n];
    sort(a,a+n+1,less<int>());
    for(int i=0;i<n+1;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}
一种中规中矩的解法。
发表于 2021-10-21 21:17:25 回复(0)
cnt = int(input())
lists = list(map(int,input().split(' ')))
num = int(input())
lists.append(num)
lists.sort()
print(*lists)

一模一样的题目,前面不是出过了嘛
发表于 2021-06-16 17:09:28 回复(0)
#include<stdio.h>
int main() {
    int n = 0;
    int arr[50] = {0};
    int m = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &arr[0]);
    for (int j = 0; j < n; j++) {
        if (arr[j] > arr[j + 1]) {
            int tmp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = tmp;
        } else
            break;
    }
    for (int i = 0; i <= n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

发表于 2024-02-04 18:51:15 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n = 0;
    int arr[100] = { 0 };
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int a = 0;
    scanf("%d", &a);
    if (a < arr[0])
    {
        printf("%d ", a);
    }
    for (int i = 0; i < n; i++)
    {
        
        printf("%d ", arr[i]);
        if (a > arr[i] && a < arr[i + 1])
        {
            printf("%d ", a);
        }
    }
    if (a > arr[n - 1])
    {
        printf("%d ", a);
    }
    return 0;
}
编辑于 2024-01-25 19:30:27 回复(1)
//解题思路:冒泡排序插入一个数字 即可
#include <stdio.h>
int main()
{
    int arr[51] = { 0 };
    int n = 0;
    scanf("%d", &n);
    //输入n个数
    int i = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d ", &arr[i]);
    }
    //插入数据
    int m = 0;
    int j = 0;
    scanf("%d", &m);
    arr[n] = m;
    int tmp = 0;
    for (i = 0; i <n; i++)
    {
        for (j = 0; j <n-i; j++)
        {
            if (arr[j] >= arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    //输出插入后的序列
    for (i = 0; i <= n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}


发表于 2023-05-24 22:48:49 回复(0)
int main() {
    int n, m;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &m);

    int pos = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] < m && arr[i + 1] > m) {
            pos = i + 1;
            break;
        }
    }

    int end = n;
    while (pos <= end) {
        arr[end] = arr[end-1];
        end--;
    }
    arr[pos] = m;

    for (int i = 0; i <= n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

发表于 2024-08-09 11:59:23 回复(0)
插入一个数放在最后,然后用冒泡排序,最后输出
#include <stdio.h>

int main() {
    int n=0;
    scanf("%d",&n);
    int arr[n+1];
    int i,j;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    int x=0;
    scanf("%d",&x);
    arr[n]=x;
    for(i=0;i<=n-1;i++)
    {
        for(j=0;j<=n-1-i;j++)
        {
            if (arr[j]>arr[j+1]) {
                int tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }
    for (i=0; i<=n; i++) {
        printf("%d ",arr[i]);
    }
    return 0;
}


发表于 2024-06-26 20:39:46 回复(0)
#include<stdio.h>
int main()
{
    int a = 0;
    int i = 0;
    int n = 0;
    int number = 0;
    int arr[20] = { 0 };
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a);
        arr[i] = a;
    }
    scanf("%d", &number);
    arr[i] = number;
    for (int i = 0; i < n + 1; i++) {
        for (int j = 0; j < n - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
        }
    }
    for(int i=0;i<=n;i++){
        printf("%d ", arr[i]);
}
        return 0;
}
发表于 2023-10-29 08:54:28 回复(0)

红黑树实现

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();
        Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            set.add(in.nextInt());
        }
        set.add(in.nextInt());
        for (Integer i : set) {
            System.out.printf("%d ",i);
        }

    }
}

link实现

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();
        LinkedList<Integer> link = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            link.add(in.nextInt());
        }
        int insert = in.nextInt();
        if (link.getLast() < insert) {
            link.add(insert);
        } else {
            for (int i = 0; i < n; i++) {
                if (link.get(i) > insert) {
                    link.add(i, insert);
                    break;
                }
            }
        }
        for (int d : link) {
            System.out.printf("%d ", d);
        }
    }
}
发表于 2023-04-22 15:29:50 回复(0)
#include <stdio.h>

int main() {
    int n = 0, i = 0;
    scanf("%d", &n);
    int arr[n + 1];
    for (i = 0; i <= n; i++) {
        scanf("%d", &arr[i]);
    }
    int temp = arr[n];
    for (i = n - 1; arr[i] > temp; i--) {
        arr[i + 1] = arr[i];
    }
    arr[i + 1] = temp;
    for (i = 0; i < n + 1; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

发表于 2023-03-19 17:38:51 回复(0)
#include <stdio.h>

int main() {
    /*
    有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,
    序列仍然是升序。
    */
    int n, k, i, j;
    int arr[50];
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &k);
    for (i = -1; i < n - 1; i++) {
        if (k <= arr[n - 1]) { // 判断插入的数是否比数组中最大的数小
            // 如果是就要将比插入数大的数全都向后移一位
            if (k <= arr[i + 1]) {
                for (j = n; j >= (i + 2); j--) {
                    arr[j] = arr[j - 1];
                }
                arr[i + 1] = k; // 将插入数放在它该在的位置
                break;
            }
        } else { // 如果不是就直接将插入数放在最后
            arr[n] = k;
        }

    }
    for (i = 0; i < n + 1; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

发表于 2022-12-23 10:32:30 回复(0)
a = int(input())
lis = list(map(int,input().split(' ')))
b = int(input())
lis.append(b)
lis.sort(reverse=0)
for i in range(0,a+1):
    s = lis[i]
    print(s,end=" ")
发表于 2022-05-14 22:42:31 回复(0)
#include <stdio.h>
int main()
{
    int N = 0;
    int arr[50] = {0};
    int num = 0;
    int i = 0;
    scanf("%d", &N);
    for (i = 0; i < N; i++)
        scanf("%d", &arr[i]);
    scanf("%d", &num);
    int flag = 0;
    for (i = 0; i < N; i++)
    {
        if (num <= arr[i] && flag == 0)
        {
            printf("%d ", num);
            flag = 1;
        }
        printf("%d ", arr[i]);
    }
    if (flag == 0)
        printf("%d ", num);
    printf("\n");
    return 0;
}

发表于 2022-05-12 13:49:23 回复(0)