一、实验目的及要求
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();
}
}