有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
共三行,
第一行输入一个整数(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>
#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;
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>
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;
}