A
从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。【必须使用冒泡排序实现】
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int []a=new int[10];
int temp;
for(int i=0;i<10;i++){
a[i]=in.nextInt();
}
for(int k=0;k<9;k++){
for(int j=0;j<9-k;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<10;i++){
System.out.println(a[i]);
}
}
}
B 用二分搜索
请编写一个程序,输入包含n(n<=100000)个整数的数列S以及包含q个(q<=50000)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109。S的元素按升序排列,T的元素不重复。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
while(in.hasNext()){
int c=0;
int n=in.nextInt();
int []s=new int[n];
for(int i=0;i<n;i++){
s[i]=in.nextInt();
}
int q=in.nextInt();
int []t=new int[q];
for(int j=0;j<q;j++){
t[j]=in.nextInt();
int b=B(s,t[j],0,n-1);
if(b>-1){
c++;
}
}
System.out.println(c);
}
}
public static int B(int []a,int key,int f,int end){
int m=(f+end)/2;
if(f>end){
return -1;
}
if(key<a[m]){
return B(a,key,f,m-1);
} else if(key>a[m]){
return B(a,key,m+1,end);
}
else return m+1;
}
}
C 随机数
有一个rand(n)的函数,它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数,它的代码如下:
int random(int n, int m)
{
return rand(n)+m;
}
显而易见的是函数random(n,m)可以产生任意范围的随机数。现在问题来了,如果我想要产生范围在[a,b)内的一个随机数,那么对应的n,m分别为多少?
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int c=in.nextInt();
for(int i=0;i<c;i++){
int a=in.nextInt();
int b=in.nextInt();
int n=a;
int m=b-a;
System.out.println(m+" "+n);
}
}
}
D整数奇偶排序
输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求:
1.先输出其中的奇数,并按从大到小排列;
2.然后输出其中的偶数,并按从小到大排列。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
while(in.hasNext()){
int m=0,n=9;
int []a=new int[10];
int []l=new int[10];
for(int i=0;i<10;i++){
l[i]=in.nextInt();
}
for(int i=0;i<l.length;i++){
if(l[i]%2==1){
a[m]=l[i];
m++;
}
else {
a[n]=l[i];
n--;
}
}
Arrays.sort(a,0,m);
for(int i=0;i<m/2;i++){
int t=a[i];
a[i]=a[m-i-1];
a[m-i-1]=t;
}
Arrays.sort(a,m,a.length);
for(int k=0;k<a.length;k++){
System.out.print(a[k]);
System.out.print(" ");
}
System.out.println();
}
}
}
E 快速排序
编程实现快速排序算法,深入理解快速排序算法的基本思想。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int []a=new int[n];
for(int i=0;i<n;i++){
a[i]=in.nextInt();
}
q(a,0,n-1);
for(int i=0;i<n;i++){
System.out.print(a[i]);
System.out.print(" ");
}
System.out.println();
}
}
public static void q(int []arr,int p,int q){
if(p>=q)return;
int r=partion(arr,p,q);
q(arr,p,r-1);
q(arr,r+1,q);
}
public static int partion(int []arr,int p,int q){
int r=arr[p];
int i=p,j;
for(j=p+1;j<=q;j++){
if(arr[j]<r){
i++;
swap(arr,i,j);
}
}
swap(arr,p,i);
return i;
}
public static void swap(int a[],int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
F 随机化快速排序
使用Java或C++等语言中内置的随机函数实现随机化快速排序,在数组中随机选择一个元素作为分区的主元(Pivot)。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int []a=new int[n];
for(int i=0;i<n;i++){
a[i]=in.nextInt();
}
q(a,0,n-1);
for(int i=0;i<n;i++){
System.out.print(a[i]);
System.out.print(" ");
}
System.out.println();
}
}
public static void q(int []arr,int p,int q){
if(p>=q)return;
int r=partion(arr,p,q);
q(arr,p,r-1);
q(arr,r+1,q);
}
public static int partion(int []arr,int p,int q){
int ram=random(p,q);
swap(arr,p,ram);
int r=arr[p];
int i=p,j;
for(j=p+1;j<=q;j++){
if(arr[j]<r){
i++;
swap(arr,i,j);
}
}
swap(arr,p,i);
return i;
}
public static void swap(int a[],int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static int random(int p,int q){
return (int) Math.abs(Math.random()%(q-p+1)+p);
}
}