有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
共三行,
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出为一行,N+1个有序排列的整数。
7 5 30 40 50 60 70 90 20
5 20 30 40 50 60 70 90
#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; }
#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]); } }
#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; }//用动态内存分配的数组处理时可扩展性更好;
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(); } }
#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; }
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; }
#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; }
红黑树实现
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); } } }
#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; }
#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; }
#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; }