排序和查找

一、实验目的及要求

1:基数排序算法实现。
2:二分查找算法实现。
3:2SUM问题,即查找两个数,使得其和为某一个值,且时间复杂度为O(n)。

二、实验内容及步骤

1、基数排序


import java.util.Arrays;
import java.util.Scanner;
public class Radix {
	public static void main(String[] args) {
		System.out.println("输入数组长度:");
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println("输入基数大小:");
		int r=sc.nextInt();    //定义r为基数(10)
		int[] arr = new int[n];
		System.out.println("排序之前:");
		for (int i = 0; i < arr.length; i++) {
			arr[i]=(int)(Math.random()*1000+1);
			System.out.print(arr[i] + " ");
		}
		System.out.println();
		long startTime=System.nanoTime();
		radixSort(arr, r, 4);
		long endTime=System.nanoTime();
		System.out.println("程序运行时间为:"+(endTime-startTime)/(10E9)+"s");
		System.out.println("排序后的数组:");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");	
		}
		sc.close();
	}
	public static void radixSort(int[] arr, int radix, int f) {
		//存放数组
		int[] temp = new int[arr.length];
		// bucket用于记录待排序元素的信息,定义了radix个桶
		int[] bucket = new int[radix];   
		for (int i = 0, d = 1; i < f; i++) {
			//每次重新统计下一个子关键字时,将bucket数组置0
		 	for(int k=0;k<bucket.length;k++) {
				bucket[k]=0;    
			}
			// 将arr中的元素完全复制到temp数组中
			System.arraycopy(arr, 0, temp, 0, arr.length);
			// 计算每个待排序数据的子关键字
			for (int j = 0; j <arr.length; j++) {
				int key = (temp[j] / d) % radix;
				bucket[key]++;
			}
			//将每趟排序的数组存入bucket中(桶中数字倒出)!!!
			for (int j = 1; j < radix; j++) {
					bucket[j] +=bucket[j - 1];
			}
			// 按子关键字对指定的数据进行排序
			for (int m = arr.length - 1; m >= 0; m--) {
				int key = (temp[m] / d) % radix;
				bucket[key]=--bucket[key];   
				arr[bucket[key]] = temp[m];
			}
			d *= radix;
		}
	}	
}

在这里插入图片描述
2、二分查找


import java.util.Scanner;
public class BinarySearch {
	public static int binarySearch(int []arr,int temp) {
		if(arr.length>0) {
			int low=0,high=arr.length-1;
			while(low<=high) {
				int mid=(low+high)/2;
			    if(arr[mid]==temp){
					return mid;
				}else if(arr[mid]>temp) {
					high=mid-1;
				}
			    else {
					low=mid+1;
				}
			}
		}
		return -1;
	}
	public static void main(String[] args) {
		int []arr= {24,34,56,79,80,91,100};
		Scanner sc=new Scanner(System.in);
		int temp=sc.nextInt();   //91 12
		int a = binarySearch(arr,temp);
		 //System.out.println(a);
		if(a==-1) {
		    System.out.println("在序列中不能查找到该数");
		}else {
			 System.out.println("在序列中能查找到该数");
		}
	}

}

在这里插入图片描述
在这里插入图片描述
3、2SUM问题

import java.util.Scanner;
import sortArray.QuickSort;
public class TwoSum {
	public static void Twosum(int[]arr,int key) {
		if(arr.length<2) {
			System.out.println("无法找到和为"+key+"的两个数");
		}
		else if(arr.length>2) {
			int low=0,high=arr.length-1;
			while(low<=high) {
				if(key==arr[low]+arr[high]) {
					System.out.println("查找到和为"+key+"的两个数是"+arr[low]+" "+arr[high]);
					low++;
					high--;
				}
				else if(key<arr[low]+arr[high]){
					    high--;
				}else if(key>arr[low]+arr[high]){
					   low++;
				} 
			}	
		}
	}
	public static void main(String[] args) {
		System.out.println("输入数组长度:");
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] arr = new int[n];
		System.out.println("排序之前:");
		for (int i = 0; i < arr.length; i++) {
			arr[i]=(int)(Math.random()*1000+1);
			System.out.print(arr[i] + " ");
		}
		System.out.println();
		QuickSort q =new QuickSort();
		q.quickSort(arr);
	   System.out.println("排序后的数组:");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");	
			//System.out.print(data[i] + "\t");
		}	
		System.out.println();
		System.out.print("请输入要查找的TwoSum:");
		long startTime=System.nanoTime();
		int key=sc.nextInt();
		Twosum(arr,key);
		long endTime=System.nanoTime();
		System.out.println("程序运行时间为:"+(endTime-startTime)/(10E9)+"s");
		sc.close();
	}

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值