第五周习题

A、冒泡排序

题目描述

  • 从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。【必须使用冒泡排序实现】

输入

  • 以空格分隔的10个整数

输出

  • 依次输出排好序的10个整数,每个数占一行。

样例输入 Copy

1 3 5 7 9 2 4 6 8 0

样例输出 Copy

0
1
2
3
4
5
6
7
8
9

我的自白

  • 【冒泡排序,就是不断做比较,这个,我写的时候发现我之前写过一个一样的,然后我就直接ctrl+c加ctrl+v了,广大朋友们,绝对不要学我,没有好处,真的!更让我觉得我真的是太绝了,我还忘了我是不是记录过一次了,啊——————】

代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int temp;
		int []a = new int[20];
		while(sc.hasNext()){
			for(int i=0;i<10;i++)
				a[i] = sc.nextInt();			
			for(int i=0;i<10;i++)
				for(int j=0;j<10-i-1;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的元素不重复。

输入

  • 第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。

输出

  • 用1行输出C。

样例输入 Copy

5
1 2 3 4 5
3
3 4 1

样例输出 Copy

3

我的自白

  • 【上周的练习题中,是用线性搜索做的,那是选择了T数组的值作为KEY值,然后和S数组的值比较,相等的话就计数,然后用二分搜索的话,我就直接调用了二分搜索的这个函数,上周的练习题中也有二分搜索,我把上周练习题的链接放在这里吧:二分搜索还有线性搜索都在这个链接这里咯

代码

如果有什么不对的地方,还请一定要告诉我呢!

import java.util.Scanner;

public class Main {
	public static int cbb(int shuzu[], int key) {
        int mid = shuzu.length / 2;
        if (key == shuzu[mid]) {
            return mid+1;
        }
 
        int low= 0;
        int high = shuzu.length - 1;
        while (low<= high) {
            mid = (high - low) / 2 + low;
            if (key < shuzu[mid]) {
                high = mid - 1;
            } else if (key > shuzu[mid]) {
                low = mid + 1;
            } else {
                return mid+1;
            }
        }
        return -1;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int bb[]= new int[1000];
		while(sc.hasNext()){
			
			int n = sc.nextInt();
			int S[] = new int[n];
			for(int i=0;i<n;i++)
				S[i] = sc.nextInt();
			
			
			int q = sc.nextInt();
			int T[] = new int[q];
			for(int i=0;i<q;i++)
				T[i] = sc.nextInt();
			int geshu = 0;
			for(int i=0;i<q;i++)
				if(cbb(S,T[i])!=-1){
					geshu++;
				}							
				System.out.println(geshu);	
			}
				
		}
}

C、随机数

题目描述

  • 有一个rand(n)的函数,它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数,它的代码如下:
int random(int n, int m)

{

         return rand(n)+m;

}
  • 显而易见的是函数random(n,m)可以产生任意范围的随机数。现在问题来了,如果我想要产生范围在[a,b)内的一个随机数,那么对应的n,m分别为多少?

输入

  • 输入的第一行为一个正整数T (T<=1000),表示一共有T组测试数据。
  • 对于每组测试数据包含两个整数a,b (a<=b)。

输出

  • 对于每组测试数据,输出一行包含两个整数n和m,两个整数中间有一个空格分隔。

样例输入 Copy

2
0 5
1 4

样例输出 Copy

5 0
3 1

我的自白

代码

import java.util.Scanner;

public class Main{
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int flag = sc.nextInt();
			while(sc.hasNext()) {
				while(sc.hasNext()) {
					int a = sc.nextInt();
					int b = sc.nextInt();
					int n = b-a;
					int m = a;
				System.out.println(n+" "+m);
			    }
			}
		}
}

D、整数奇偶排序

题目描述

  • 输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求:
  • 1.先输出其中的奇数,并按从大到小排列;
  • 2.然后输出其中的偶数,并按从小到大排列。

输入

  • 任意排序的10个整数(0~100),彼此以空格分隔。

输出

  • 可能有多组测试数据,对于每组数据,按照要求排序后输出,由空格分隔。

样例输入 Copy

0 56 19 81 59 48 35 90 83 75 
17 86 71 51 30 1 9 36 14 16 

样例输出 Copy

83 81 75 59 35 19 0 48 56 90
71 51 17 9 1 14 16 30 36 86

提示

  • 多组数据,注意输出格式
  • 测试数据可能有很多组,请使用while(cin>>a[0]>>a[1]>>…>>a[9])类似的做法来实现;
  • 输入数据随机,有可能相等。

我的自白

  • 【这个题目,我本来想的是,就是三个数组嘛,先定义一个数组用来存放输入的数据,有奇数也有偶数,然后,在判断是否整数数组里的数据是否能被2整除,如果可以,那说明就是偶数,然后放进偶数数组里,那么不能被2整除的数据就放进奇数数组里,然后都用冒泡排序排好,再放回整数数组里,然而,想的挺美的,运行结果老是说我超限了,我也改不出来,完全不知道为什么,哭唧唧QAQ~,然后,不懈努力下,我找到了大佬们的代码,通过了!】

    链接:整数奇偶排序,记得点击这里哦!

代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
			while(sc.hasNext()){
				int qishu[] = new int[10];
		        int oushu[] = new int[10];
		        int zhengshu[] = new int[10];
		        
		        for(int i=0;i<10;i++)
		            zhengshu[i]=sc.nextInt();
		        
		        int qi = 0,i,j;
		        int ou = 0;
		        for(i=0;i<10;i++) 
		            if(zhengshu[i]%2==0)
		            	oushu[ou++]=zhengshu[i];
		            else 
		            	qishu[qi++]=zhengshu[i];
		 
				for(i=0;i<ou;i++)
					for(j=0;j<ou-i-1;j++)
						if(oushu[j]>oushu[j+1])
						{
							int temp=oushu[j];
							oushu[j]=oushu[j+1];
							oushu[j+1]=temp;
						}
				
				for(i=0;i<qi;i++)
					for(j=0;j<qi-i-1;j++)
						if(qishu[j]<qishu[j+1])
						{
							int temp=qishu[j];
							qishu[j]=qishu[j+1];
							qishu[j+1]=temp;
						}
				
		        for(i=0;i<qi;i++)
		            zhengshu[i]=qishu[i];
		        for(j=0;j<ou;j++,i++)
		            zhengshu[i]=oushu[j];
		 
		        
		        for(i=0;i<10;i++)
		            System.out.print(zhengshu[i]+" ");
		   }
	}

}

E、快速排序

题目描述

  • 编程实现快速排序算法,深入理解快速排序算法的基本思想。

输入

  • 多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。

输出

  • 输出快速排序之后的一维整型数组(升序)

样例输入 Copy

6 1 8 6 5 3 4
5 12 42 2 5 8

样例输出 Copy

1 3 4 5 6 8
2 5 8 12 42

我的自白

  • 【我觉得自己能力还是不行,老师虽然上课讲过了,但到了自己写,还是错误百出,不是数组超限,就是哪里哪里有问题,所以还是需要借鉴别人写的代码,但还是像记录一下呢!这个我属实不记得在哪里找到的,看了太多代码了,也改了很多次,所以原作,抱歉哈,找不到你了】

代码

import java.util.Scanner;

public class Main {
	
	public static void jiaohuan(int cbb[],int i,int j){//比較大小,小的在前,大的在后
		int temp = cbb[i];
		cbb[i] = cbb[j];
		cbb[j] = temp;
	}
	public static int fenqu(int cbb[],int left,int right){//分區,前面都是小於基準的,後面都是大於基準的
		int jizhun = cbb[left];//基準
		
        while (left < right) {// 最终使得枢纽之前(后)的记录均不大(小)于它
        	
            while (left < right && cbb[right] >= jizhun)
                right--;
            
            jiaohuan(cbb, left, right);// 将比枢轴记录小的记录交换到低端
 
            while (left < right && cbb[left] <= jizhun)
                left++;
           
            jiaohuan(cbb, left, right); // 将比枢轴大的记录交换到高端
        }
        return left;
	}
	private static  void kuaipai(int cbb[],int left,int right){
		
		if(left<right){
			
			int r = fenqu(cbb,left,right);//p,q兩個端點,分區縮小範圍
			kuaipai(cbb,left,r-1);
			kuaipai(cbb,r+1,right);
		}
	}
	
	public static void kuaipai(int cbb[]){
		kuaipai(cbb, 0, cbb.length - 1);
		 
        
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()){
			int n = sc.nextInt();
			int cbb[] = new int[n];
			for(int i=0;i<cbb.length;i++)
				cbb[i] = sc.nextInt();
			 
	        new Main().kuaipai(cbb);
	        for(int i=0;i<cbb.length;i++)
	            System.out.print(cbb[i]+" ");

			
		}
	}

}

F、随机化快速排序

我的自白

  • 【老实说,这就是快速排序的优化,但是呢,嗯,不出我所料,果然但靠自己还是错误一大堆,但是,基本的代码都没变,就是在原来的代码基础上增加了两个代码,然后就OK了,链接:快速排序 可以看下这个文章,我找到的不一定是为好的,就是一个小小的参考而已】

代码

import java.util.Random;
import java.util.Scanner;

public class Main {
	
	public static void jiaohuan(int cbb[],int i,int j){//比較大小,小的在前,大的在后
		int temp = cbb[i];
		cbb[i] = cbb[j];
		cbb[j] = temp;
	}
	public static int fenqu(int cbb[],int left,int right){//分區,前面都是小於基準的,後面都是大於基準的
		int jizhun = cbb[left];//基準
		
        while (left < right) {// 最终使得枢纽之前(后)的记录均不大(小)于它
        	
            while (left < right && cbb[right] >= jizhun)
                right--;
            
            jiaohuan(cbb, left, right);// 将比枢轴记录小的记录交换到低端
 
            while (left < right && cbb[left] <= jizhun)
                left++;
           
            jiaohuan(cbb, left, right); // 将比枢轴大的记录交换到高端
        }
        return left;
	}
	private static  void kuaipai(int cbb[],int left,int right){
		
		if(left<right){
			
			int r = fenqu(cbb,left,right);//p,q兩個端點,分區縮小範圍
			kuaipai(cbb,left,r-1);
			kuaipai(cbb,r+1,right);
		}
	}
	
	public static void kuaipai(int cbb[]){
		kuaipai(cbb, 0, cbb.length - 1);      
	}
	
	public static int random(int a,int b) {
		Random rand=new Random();
		int s=rand.nextInt(b);
		return s;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()){
			int n = sc.nextInt();
			int cbb[] = new int[n];
			for(int i=0;i<cbb.length;i++)
				cbb[i] = sc.nextInt();
			
		    int k=random(0,n);//随机选中的下标
		    
		    int t=cbb[k];
		    cbb[k]=cbb[0];
		    cbb[0]=t;//把此下标的数与0下标的数交换,作为主元,其他不用动
		    
		    kuaipai(cbb,0,n-1);
		    for(int i=0;i<n;i++) {
		    	System.out.print(cbb[i]+" ");
		    }
		}
		

	}

}
  • 【我不是很喜欢远方,可我依旧向往】
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年游四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值