「跳跃算法java」算法导论 跳跃表
今天给各位分享跳跃算法java的知识,其中也会对算法导论 跳跃表进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、求JAVA大神解决跳绳问题
- 2、关于给定的数组问题,给定的数组,a[0],a[1],a[2],a[3],a[4]有一索引,实现跳跃.记录跳跃次数
- 3、100个数字逢3跳1哪个算法最快
- 4、java跳数计算
- 5、数据结构 java开发中常用的排序算法有哪些
求JAVA大神解决跳绳问题
简单分析了一下实际上不难
最开始的6作为一个循环输入和建立数组的长度就可以
接下来对6组数据作一个简单的分析后很明显有个一个规律
1、将 最后一个数值 作为 计算数值,并且设置一个递归标记 初值为0
2、计算数值+3*(跳坏的次数-标记)= 经过时间
3、若 经过时间60
那么就有:一分钟内的次数=计算数值+(60-经过时间)
4、若 60=经过时间=62
那么说明最后一次跳坏后再等待中时间结束,
那么就有:一分钟内的次数=计算数值
5、若 经过时间62
那么将 计算数值的前一个数 作为 计算数值,并将标记递增1,然后从第2步开始计算
当然可以加一个安全检测
在开始计算某一组数开始之前判断一下,第一个次跳坏前的次数若大于60,不进行计算直接输出60
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class test2 {
public static void main(String [] args){
int size;
Scanner sc = new Scanner(System.in);
size = Integer.parseInt(sc.nextLine()); //输入数据总量
int [] num = new int [size];
for(int i = 0; i size; i++){
String st = sc.nextLine();
num[i] = getNumber(st);
}
for(int a:num)System.out.println(a);
}
public static int getNumber(String st){
String[] as = st.split(" "); //以空格为单位分割字符串
int [] num = new int[as.length];
for(int j = 0; j as.length ;j++)
num[j] = Integer.parseInt(as[j]);//将分割后的字符型数字转换成int型
if(num[0]==0 || num[1]=60)return 60;
int sign = 0;
int elem = num[num.length-1];
int back = -1;
while(true){
int time= elem + 3* (num[0]-sign);
if(time60){
back = elem + (60 - time);
}else if(time62){
sign++;
elem = num[num.length-1-sign];
}else{
back = elem;
}
if(back!=-1)break;
}
return back;
}
}
效果图:
关于给定的数组问题,给定的数组,a[0],a[1],a[2],a[3],a[4]有一索引,实现跳跃.记录跳跃次数
看不懂你说的是什么意思。跳跃是什么意思?
for(int i=0;iA.length;i++)
{
if(i!=1)
{
//这里写入你的代码
}
}
100个数字逢3跳1哪个算法最快
pre t="code" l="java"class SortTest { // 冒泡排序
public void sort(int[] args) {
for (int m : args) {
System.out.print("排序前 " + args[m] + " ");
}
int time1 = 0, time2 = 0;
for (int i = 0; i args.length - 1; i++) {
++time1;
for (int j = i + 1; j args.length; j++) {
++time2;
int temp;
if (args[i] args[j]) {
temp = args[j];
args[j] = args[i];
args[i] = temp;
}
}
}
System.out.println();
System.out.println("外循环次数:" + time1 + "内循环次数:" + time2);
for (int n : args) {
System.out.print("排序后 " + n + " ");
}
}
public static void main(String[] args) {
int[] arg = new int[] { 2, 1, 4, 5, 8, 7, 6, 3, 9, 0 };
new SortTest().sort(arg);
}
}
// 降序排列 循环次数最少
// 输出结果为:
// 排序前 4 排序前 1 排序前 8 排序前 7 排序前 9 排序前 3 排序前 6 排序前 5 排序前 0 排序前 2
// 外循环次数:9 内循环次数:45
// 排序后 0 排序后 1 排序后 2 排序后 3 排序后 4 排序后 5 排序后 6 排序后 7 排序后 8 排序后 9 pre t="code" l="java"import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/**
* class name: RapidSort
* description: Java快速排序法:数组和集合
* @author Jr
*
*/
public class RapidSort {
public static void QuickSort(int e[], int first, int end) {
int i = first, j = end, temp = e[first];
while (i j) {
while (i j e[j] = temp)
j--;
e[i] = e[j];
while (i j e[i] = temp)
i++;
e[j] = e[i];
}
e[i] = temp;
if (first i - 1)
QuickSort(e, first, i - 1);
if (end i + 1)
QuickSort(e, i + 1, end);
}
public static void main(String[] args) {
int arr[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
int len = 8;
int i;
System.out.printf("before sort\n");
for (i = 0; i len; i++)
System.out.printf("%d ", arr[i]);
System.out.printf("\n");
QuickSort(arr, 0, len - 1);
System.out.printf("after sorted\n");
for (i = 0; i len; i++)
System.out.printf("%d ", arr[i]);
}
}
结果:
before sort
49 38 65 97 76 13 27 49
after sorted
13 27 38 49 49 65 76 97
java跳数计算
1 点击进入按钮
获取一个时间
long enterTime = System.currentTimeMillis(); //这是获取毫秒数
这个你得保存进数据库 然后根据识别信息 区别是哪个客户。
2 点击离开按钮
long leaveTime = System.currentTimeMillis(); //这是获取毫秒数
根据识别信息,在数据库,找到对应的enterTime
leaveTime -- enterTime 就是车子停留的毫秒数
(leaveTime -- enterTime)/1000 秒数
(leaveTime -- enterTime)/(1000*60*60) 小时数
当然了,小时有浮点数,比如1.6小时可能按照2小时计算之类的算法要自己计算。
数据结构 java开发中常用的排序算法有哪些
排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准:
(1)执行时间
(2)存储空间
(3)编程工作
对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。
主要排序法有:
一、冒泡(Bubble)排序——相邻交换
二、选择排序——每次最小/大排在相应的位置
三、插入排序——将下一个插入已排好的序列中
四、壳(Shell)排序——缩小增量
五、归并排序
六、快速排序
七、堆排序
八、拓扑排序
一、冒泡(Bubble)排序
----------------------------------Code 从小到大排序n个数------------------------------------
void BubbleSortArray()
{
for(int i=1;in;i++)
{
for(int j=0;in-i;j++)
{
if(a[j]a[j+1])//比较交换相邻元素
{
int temp;
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
-------------------------------------------------Code------------------------------------------------
效率 O(n²),适用于排序小列表。
二、选择排序
----------------------------------Code 从小到大排序n个数--------------------------------
void SelectSortArray()
{
int min_index;
for(int i=0;in-1;i++)
{
min_index=i;
for(int j=i+1;jn;j++)//每次扫描选择最小项
if(arr[j]arr[min_index]) min_index=j;
if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
-------------------------------------------------Code-----------------------------------------
效率O(n²),适用于排序小的列表。
三、插入排序
--------------------------------------------Code 从小到大排序n个数-------------------------------------
void InsertSortArray()
{
for(int i=1;in;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
{
int temp=arr[i];//temp标记为未排序第一个元素
int j=i-1;
while (j=0 arr[j]temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
------------------------------Code--------------------------------------------------------------
最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表
若列表基本有序,则插入排序比冒泡、选择更有效率。
四、壳(Shell)排序——缩小增量排序
-------------------------------------Code 从小到大排序n个数-------------------------------------
void ShellSortArray()
{
for(int incr=3;incr0;incr--)//增量递减,以增量3,2,1为例
{
for(int L=0;L(n-1)/incr;L++)//重复分成的每个子列表
{
for(int i=L+incr;in;i+=incr)//对每个子列表应用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j=0arr[j]temp)
{
arr[j+incr]=arr[j];
j-=incr;
}
arr[j+incr]=temp;
}
}
}
}
--------------------------------------Code-------------------------------------------
适用于排序小列表。
效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。
壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。
五、归并排序
----------------------------------------------Code 从小到大排序---------------------------------------
void MergeSort(int low,int high)
{
if(low=high) return;//每个子列表中剩下一个元素时停止
else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/
MergeSort(low,mid);//子列表进一步划分
MergeSort(mid+1,high);
int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素
for(int i=low,j=mid+1,k=low;i=mid j=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/
{
if (arr[i]=arr[j];)
{
B[k]=arr[i];
I++;
}
else
{ B[k]=arr[j]; j++; }
}
for( ;j=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表
B[k]=arr[j];
for( ;i=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中
B[k]=arr[i];
for(int z=0;zhigh-low+1;z++)//将排序的数组B的 所有元素复制到原始数组arr中
arr[z]=B[z];
}
-----------------------------------------------------Code---------------------------------------------------
效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。
适用于排序大列表,基于分治法。
六、快速排序
------------------------------------Code--------------------------------------------
/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low];//采用子序列的第一个元素作为枢纽元素
while (low high)
{
//从后往前栽后半部分中寻找第一个小于枢纽元素的元素
while (low high arr[high] = pivot)
{
--high;
}
//将这个比枢纽元素小的元素交换到前半部分
swap(arr[low], arr[high]);
//从前往后在前半部分中寻找第一个大于枢纽元素的元素
while (low high arr [low ]=pivot )
{
++low ;
}
swap (arr [low ],arr [high ]);//将这个枢纽元素大的元素交换到后半部分
}
return low ;//返回枢纽元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n +1,high );
}
}
----------------------------------------Code-------------------------------------
平均效率O(nlogn),适用于排序大列表。
此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n²)的最糟用例效率。若数基本有序,效率反而最差。选项中间值作为枢纽,效率是O(nlogn)。
基于分治法。
七、堆排序
最大堆:后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。
思想:
(1)令i=l,并令temp= kl ;
(2)计算i的左孩子j=2i+1;
(3)若j=n-1,则转(4),否则转(6);
(4)比较kj和kj+1,若kj+1kj,则令j=j+1,否则j不变;
(5)比较temp和kj,若kjtemp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)
(6)令ki等于temp,结束。
-----------------------------------------Code---------------------------
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元 int I; BuildHeap(R); //将R[1-n]建成初始堆for(i=n;i1;i--) //对当前无序区R[1..i]进行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质 } } ---------------------------------------Code--------------------------------------
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 堆排序是就地排序,辅助空间为O(1), 它是不稳定的排序方法。
堆排序与直接插入排序的区别:
直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
堆排序可通过树形结构保存部分比较结果,可减少比较次数。
八、拓扑排序
例 :学生选修课排课先后顺序
拓扑排序:把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。
方法:
在有向图中选一个没有前驱的顶点且输出
从图中删除该顶点和所有以它为尾的弧
重复上述两步,直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止。
---------------------------------------Code--------------------------------------
void TopologicalSort()/*输出拓扑排序函数。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/
{
int indegree[M];
int i,k,j;
char n;
int count=0;
Stack thestack;
FindInDegree(G,indegree);//对各顶点求入度indegree[0....num]
InitStack(thestack);//初始化栈
for(i=0;iG.num;i++)
Console.WriteLine("结点"+G.vertices[i].data+"的入度为"+indegree[i]);
for(i=0;iG.num;i++)
{
if(indegree[i]==0)
Push(thestack.vertices[i]);
}
Console.Write("拓扑排序输出顺序为:");
while(thestack.Peek()!=null)
{
Pop(thestack.Peek());
j=locatevex(G,n);
if (j==-2)
{
Console.WriteLine("发生错误,程序结束。");
exit();
}
Console.Write(G.vertices[j].data);
count++;
for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)
{
k=p.adjvex;
if (!(--indegree[k]))
Push(G.vertices[k]);
}
}
if (countG.num)
Cosole.WriteLine("该图有环,出现错误,无法排序。");
else
Console.WriteLine("排序成功。");
}
----------------------------------------Code--------------------------------------
算法的时间复杂度O(n+e)。
关于跳跃算法java和算法导论 跳跃表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-20,除非注明,否则均为
原创文章,转载请注明出处。