4.1 算法
前面我们已经讲过,程序=数据结构+算法。
什么是算法?对一个现有的问题我们采取的解决过程及方法,即为算法。一个用算法实现的程序会耗费两种资源:处理时间和内存。
算法的效率分析标准:
时间复杂度
空间复杂度
简单性和清晰性
对于时间复杂度,可以通过System.currentTimeMillis()方法来测试。例如:public class Test
{
public static void main(String args[])
{
System.out.println(System.currentTimeMillis());
fun();
System.out.println(System.currentTimeMillis());
}
public static void fun()
{
double a = 0;
for(int i = 0; i < 10000; i++)
for(int j = 0; j < 10000; j++)
for(int k = 0; k < 100; k++)
a++;
}
}
前后两次获得当前系统时间的差值就是运行所消耗的时间(毫秒为单位)。
通过System.currentTimeMillis()方法来测试的缺点:
a.不同的平台执行的时间不同
b.有些算法随着输入数据的加大,测试时间会变得不切实际!
4.2 查找
4.2.1 查找之线性查找(直接查找)
算法思路:从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值。
注意:被查找的数组中的元素可以是无序的、随机的。
实例:
import java.util.*;
public class Demo1
{
public static void main(String args[])
{
int iArr[] = {32, 9, 78, 44, 29, 18, 97, 49, 56, 61};
System.out.println("数组的所有元素为:");
for(int i : iArr)
System.out.print(i + " ");
System.out.println();
System.out.print("请输入你要查找的元素:");
Scanner scan = new Scanner(System.in);
int iNum = scan.nextInt();
int index = straightSearch(iArr, iNum);
if(index == -1)
System.out.println("没有找到元素" + iNum);
else
System.out.println("找到元素" + iNum + ", 下标为:" + index);
}
public static int straightSearch(int[] arr, int num)
{
int i = 0;
for(; i < arr.length; i++)
{
if(arr[i] == num)
return i;
}
return -1;
}
}
4.2.2 查找之折半查找(二分查找)
算法思路:假设被查找数组中的元素是升序排列的,那我们查找值时,首先会直接到数组的中间位置(数组长度/2),并将中间值和查找值比较,如果相等则返回,否则,如果当前元素值小于查找值,则继续在数组的后面一半查找(重复上面过程);如果当前元素值大于查找值,则继续在数组的前面一半查找,直到找到目标值或者无法再二分数组时停止。
注意:二分查找只是针对有序排列的各种数组或集合。
实例:
//不利用递归实现
import java.util.*;
public class Demo1
{
public static void main(String args[])
{
int iArr[] = {1, 2, 3, 4, 6, 8, 22, 44, 99, 111, 112, 116};
System.out.println("数组的所有元素为:");
for(int i : iArr)
System.out.print(i + " ");
System.out.println();
System.out.print("请输入你要查找的元素:");
Scanner scan = new Scanner(System.in);
int iNum = scan.nextInt();
int index = binarySearch(iArr, iNum, 0, iArr.length-1);
if(index == -1)
System.out.println("没有找到元素" + iNum);
else
System.out.println("找到元素" + iNum + ", 下标为:" + index);
}
public static int binarySearch(int[] arr, int num, int iMin, int iMax)
{
while(iMin <= iMax)
{
int iMid = (iMin + iMax) / 2;
if(num == arr[iMid])
return iMid;
else if(num < arr[iMid])
iMax = iMid-1;
else
iMin = iMid+1;
}
return -1;
}
}
//利用递归实现
import java.util.*;
public class Demo1
{
public static void main(String args[])
{
int iArr[] = {1, 2, 3, 4, 6, 8, 22, 44, 99, 111, 112, 116};
System.out.println("数组的所有元素为:");
for(int i : iArr)
System.out.print(i + " ");
System.out.println();
System.out.print("请输入你要查找的元素:");
Scanner scan = new Scanner(System.in);
int iNum = scan.nextInt();
int index = binarySearch(iArr, iNum, 0, iArr.length-1);
if(index == -1)
System.out.println("没有找到元素" + iNum);
else
System.out.println("找到元素" + iNum + ", 下标为:" + index);
}
public static int binarySearch(int[] arr, int num, int iMin, int iMax)
{
int iMid = (iMin + iMax) / 2;
if (num < arr[iMin] || num > arr[iMax])
return -1;
else if (num == arr[iMid])
return iMid;
else if (num < arr[iMid])
return binarySearch(arr, num, iMin, iMid - 1);
else
return binarySearch(arr, num, iMid + 1, iMax);
}
}
4.3 排序
4.3.1 排序之插入排序
4.3.1.1 插入排序之直接插入排序
算法思路:直接插入排序(straight insertion sort)是一种最简单的排序方法。它的基本操作是将一个记录插入到一个长度为m (假设)的有序表中,使之仍保持有序,从而得到一个新的长度为m + 1的有序表。设有一组关键字{K1 ,K2 ,…,Kn};排序开始就认为K1 是一个有序序列;让K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让Kn插入上述表长为n-1 的有序序列,得一个表长为n 的有序序列。
实例:
//49, 38, 65, 97, 76, 13, 27 初始情况
//[49], 38, 65, 97, 76, 13, 27 从下标1开始
//[38, 49], 65, 97, 76, 13, 27
//[38, 49, 65], 97, 76, 13, 27
//[38, 49, 65, 97], 76, 13, 27
//[38, 49, 65, 76, 97], 13, 27
//[13, 38, 49, 65, 76, 97], 27
//[13, 27, 38, 49, 65, 76, 97]
代码实现:
public class Test
{
public static void main(String [] args){
int a[] = {49, 38, 65, 97, 76, 13, 27};
straightInsertSort(a);
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
public static void straightInsertSort(int a[]){
int i, m;
for (i = 1; i < a.length; i++) //共进行n-1趟插入
{
m = i;
while (m >= 1 && a[m] < a[m-1]) //短路表达式
{
a[m] = (a[m]+a[m-1]) - (a[m-1] = a[m]); //比前一个小, 则与之交换
m--;
}
}
}
}
4.3.1.2 插入排序之折半插入排序
算法思路:折半插入排序(Binary insertion sort)当直接插入排序进行到某一趟时,对于a[i]来讲,前边i-1个记录已经按有序。此时不用直接插入排序的方法,而改为先用折半查找法找出r[i]应插的位置,然后再插入。这种方法就是折半插入排序。
基本步骤:
a、初始化:设定有序区为第一个元素,设定无序区为后面所有元素
b、依次取无序区的每个元素
c、通过二分法查找有序区,返回比这个数小的最大数
d、保留此位置数据
e、从此位置的元素到有序区的最后一个元素,依次后移
f、用保留的数据填充此位置
代码实现:
public class Test
{
public static void main(String [] args){
int a[] = {49, 38, 65, 97, 76, 13, 27};
binaryInsertSort(a);
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
public static void binaryInsertSort(int a[]){
for (int i = 1; i < a.length; i++) //共进行n-1趟插入
{
int iTmp = a[i]; //将待插入数据临时保存到iTmp中去.
int m = findPosition(a, a[i], 0, i - 1); //m是a[i]应该呆的位置
for (int j = i; j > m; j--)
a[j] = a[j-1]; //整体向后移动一个位置
a[m] = iTmp; //m是a[i]应该呆的位置
}
}
public static int findPosition(int a[], int num, int iMin, int iMax)
{
if (num < a[iMin])
return iMin; //超出范围,直接返回
if (num > a[iMax])
return iMax + 1; //超出范围,直接返回
int iMid = (iMin + iMax) / 2; //选取中值,准备二分
if (a[iMid] >= num) //继续二分: 递归
return findPosition(a, num, iMin, iMid - 1); //目标在左边,递归左边(p[m]已经比较过,排出查找范围)
else //if (a[m] < num)
return findPosition(a, num, iMid + 1, iMax); //目标在右边,递归右边(p[m]已经比较过,排出查找范围)
}
}
4.3.1.3 插入排序之希尔排序
算法思路:希尔排序(Shell Sort): 是插入排序的一种。因D.L.Shell于1959年提出而得名。先取一个小于数组长度n的整数d1(一般为n/2)作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 代码实现: public class Test { public static void main(String [] args){ int a[] = {49, 38, 65, 97, 76, 13, 27}; shellSort(a); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static void shellSort(int a[]){ int k = a.length / 2; //k值代表前文中的增量d值 while (k >= 1) //当增量k值变化到0,结束循环 { for (int i = 0; i < k; i++) //将数组分成k组, 然后对每组进行直接插入排序. { for (int j = i+k; j < a.length; j += k) //共进行? 趟插入 { int m = j; while (m >= k && a[m] < a[m-k]) //短路表达式 { a[m] = (a[m]+a[m-k]) - (a[m-k]=a[m]); //比前一个小, 则与之交换 m -= k; } } } k = k / 2; } } } 4.3.2 排序之选择排序 4.3.2.1 选择排序之直接选择排序 算法思路:简单选择排序(simple selection sort)也是直接选择排序。是一种较为容易理解的方法。对于一组关键字{K1,K2,…,Kn},首先从K1,K2,…,Kn中选择最小值,假如它是Kz,则将Kz与K1对换;然后从K2,K3,…,Kn中选择最小值Kz,再将Kz与K2对换。如此进行选择和调换n-2趟,第(n-1)趟,从Kn-1、Kn中选择最小值Kz将Kz与Kn-1对换,最后剩下的就是该序列中的最大值,一个由小到大的有序序列就这样形成。 代码实现: public class Test { public static void main(String [] args){ int a[] = {49, 38, 65, 97, 76, 13, 27}; simpleSelectSort(a); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static void simpleSelectSort(int a[]){ for(int i = 1; i < a.length; i++) { int iMax = 0; for(int j = 1; j <= a.length - i; j++) { if(a[j] > a[iMax]) iMax = j; } if(iMax != a.length-i) a[iMax] = (a[iMax]+a[a.length-i]) - (a[a.length-i]=a[iMax]); } } } 4.3.3 排序之交换排序 4.3.3.1 交换排序之冒泡排序 算法思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。 代码实现: public class Test { public static void main(String [] args){ int a[] = {49, 38, 65, 97, 76, 13, 27}; bubbleSort(a); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static void bubbleSort(int a[]){ for(int i = 1; i < a.length; i++) { for(int j = 0; j < a.length - i; j++) { if(a[j] > a[j+1]) a[j] = (a[j]+a[j+1]) - (a[j+1]=a[j]); } } } } 4.3.3.2 交换排序之双向冒泡排序 算法思路:是冒泡排序的升级。双向冒泡是一个大泡从头往后冒,一个小泡从后往前冒。相对冒泡排序可减少时间。 代码实现: public class Test { public static void main(String [] args){ int a[] = {49, 38, 65, 97, 76, 13, 27}; doubleBubbleSort(a); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static void doubleBubbleSort(int a[]){ int n = a.length; for(int i = 1; i <= n/2; i++) { for(int j = i-1; j < n - i; j++) { if(a[j] > a[j+1]) a[j] = (a[j]+a[j+1]) - (a[j+1]=a[j]); if(a[n-1-j] < a[n-2-j]) a[n-1-j] = (a[n-1-j]+a[n-2-j]) - (a[n-2-j]=a[n-1-j]); } } } } 4.3.3.3 交换排序之快速排序 算法思路:快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过"一趟排序"将要排序的数据分割成独立的两部分,其中左部分的所有数据都比右部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。 一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];注意该key值在整个过程中永远不变,始终是和key进行比较。 3)从j开始由后向前搜索,找到第一个小于key的值A[j],并与A[i]交换; 4)从i开始由前向后搜索,找到第一个大于key的值A[i],并与A[j]交换; 5)重复第3、4步,直到i=j; 注意: 3)和4)步是在程序中没找到时候才j--和i++,直至找到为止。找到并交换的时候i 和j指针位置不变。 值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快排演示: key = 49 49i 38 65 97 76 13 27j 先找j开始,发现27比key小,交换i、j的值 27i 38 65 97 76 13 49j 再从i开始,发现27和38都比key小,即i++ 27 38 49i 97 76 13 65j 直到i对应的值比key大,则i、j交换 27 38 13i 97 76 49j 65 以此类推 27 38 13 49i 76 97j 65 27 38 13 49ij 76 97 65 代码实现: public class Test { public static void main(String [] args){ int a[] = {49, 38, 65, 97, 76, 13, 27}; quickSort(a, 0, a.length-1); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static void quickSort(int a[], int iMin, int iMax){ if (iMin >= iMax) return; else if (iMin + 1 == iMax) // 若只有两个元素,直接比较 { if (a[iMin] > a[iMax]) { a[iMin] = (a[iMin]+a[iMax]) - (a[iMax]=a[iMin]); } return; } int iPos = partition(a, iMin, iMax); quickSort(a, iMin, iPos - 1); //left quickSort(a, iPos + 1, iMax); //right } public static int partition(int a[], int i, int j){ int iKey= a[i]; //选取key do { //由后向前找到第一个比nKey小的元素, 并与a[i]交换 while (a[j] >= iKey && i < j) j--; if (i < j) a[i] = (a[i]+a[j]) - (a[j]=a[i]); //由前向后找到第一个比nKey大的元素, 并与a[j]交换 while (a[i] <= iKey && i < j) i++; if (i < j) a[i] = (a[i]+a[j]) - (a[j]=a[i]); } while (i < j); return j; } } 例如求平方根的(n),求a的b次方(a, b),求绝对值(n)等很多。下面是一些演示。publicclassMathTest { publicstaticvoidmain(String[]args) { intn=16; ? 3)); ? ? } } publicclassMathDemo{ publicstaticvoidmain(Stringargs[]){ /** *abs求绝对值 */ 的时候会取偶数 */ // // // // // // // // // // /** *round四舍五入,float时返回int值,double时返回long值 */ //10 //11 //11 //11 //-10 //-11 //-11 //-10 } } 函数(方法) 描述 IEEEremainder(double,double) 按照IEEE754标准的规定,对两个参数进行余数运算。 abs(inta) 返回int值的绝对值 abs(longa) 返回long值的绝对值 abs(floata) 返回float值的绝对值 abs(doublea) 返回double值的绝对值 acos(doublea) 返回角的反余弦,范围在到pi之间 asin(doublea) 返回角的反正弦,范围在-pi/2到pi/2之间 atan(doublea) 返回角的反正切,范围在-pi/2到pi/2之间 atan2(doublea,doubleb) 将矩形坐标(x,y)转换成极坐标(r,theta) ceil(doublea) 返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数cos(double) 返回角的三角余弦 exp(doublea) 返回欧拉数e的double次幂的值 floor(doublea) 返回最大的(最接近正无穷大)double值,该值小于或等于参数,并且等于某个整数log(doublea) 返回(底数是e)double值的自然对数 max(inta,intb) 返回两个int值中较大的一个 max(longa,longb) 返回两个long值中较大的一个 max(floata,floatb) 返回两个float值中较大的一个 max(doublea,doubleb) 返回两个double值中较大的一个 min(inta,intb) 返回两个int值中较小的一个 min(longa,longb) 返回两个long值中较小的一个 min(floata,floatb) JAVA中常用类的常用方法 一、类 1、clone()方法 创建并返回此对象的一个副本。要进行“ 克隆” 的对象所属的类必须实现. Cloneable接口。 2、equals(Object obj)方法 功能:比较引用类型数据的等价性。 等价标准:引用类型比较引用,基本类型比较值。 存在特例:对File、String、Date及封装类等类型来说,是比较类型及对象的内 容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法 返回该对象的哈希码值。 5、notify()方法 唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法 唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 String类 charAt(int index) 返回指定索引处的 char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比 较,不考虑大小写。 indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar) java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot), 2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤: JAVA屮常用类的常用方法 一.java?丨ang.Object 类 1、clone()方法 创建丼返M此对象的一个副木。要进行“克隆”的对象所属的类必须实现https://www.wendangku.net/doc/a95158772.html,ng. Cloneable 接口。 2、equals(Objectobj)方法 0 功能:比较引用类型数据的等价性。 0 等价标准.?引用类型比较引用,基木类型比较值。 0 存在特例.?对File、String、Date及封装类等类型来说,是比较类型及对象的内稃而+ 考虑引用的是否为同一实例。 3、finalize〇方法 当垃圾丨"丨收器确定>(、存在对该对象的更多引用时,由对象的垃圾丨"丨收器调用此方法。 4、hashCode〇方法返 回该对象的哈希码值。 5、notify〇方法 唤醒在此对象监视器上等待的中?个线祝。 6、notifyAII〇方法 唤醒在此对象监视器上等待的所有线程= 7、toString()方法 返W该对象的字符串表示。在进行String与其它类型数据的连接操作时,&动调用tostringo 方法。可以根据耑要重写toStringO方法。 8、wait()方法 在其他线程调用此对象的n〇tify()方法或notifyAIIO方法前,异致当前线程等待。 二、字符串相关类 I String 类 charAt(int index)返回指定索引处的char值。compareTo{String anotherString)按字 典顺序比较两个字符串。compareTolgnoreCase(Stringstr)按字典顺序比较两个字 符串,不考虑人小写。concat(String str)将指定字符串连接到此字符串的结尾。 endsWith(String suffix)测试此字符串是否以指定的〗?缀结束。equals{Object anObject)将此字符串与指定的对象比较。 equalslgnoreCase(String anotherString)将此String 与另一个String 比较,考虑人小'与’。indexOf(int ch)返H指定字符在此字符串屮第一次出现处的索引。 indexOf(String str)返回第一次出现的指定子字符串在此字符串屮的索引, lastlndexOf(intch)返回指定字符在此字符串中最后??次出现处的索引。 length()返|n丨此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。 split(String regex)根据给定正则表达式的匹配拆分此字符串。startsWith{String prefix)测试此字符 串是否以指定的前缀开始。substring(int beginlndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginlndex, int endlndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginlndex 处开始,一直到索引endlndex-1处的字符。 t〇CharArray()将此字符串转换为一个新的字符数组。 冒泡排序法 1.public class SortArray_01 { 2. public static void main(String args[]) { 3. int[] array = { 14, 5, 86, 4, 12, 3, 21, 13, 11, 2, 55 }; // 创建一个初始化的一维数组array 4. System.out.println("未排序的数组:"); 5. for (int i = 0; i < array.length; i++) { // 遍历array数组中的元素 6. System.out.print(" " + array[i]); // 输出数组元素 7. if ((i + 1) % 5 == 0) // 每5个元素一行 8. System.out.println(); 9. } 10. int mid; // 定义一个中间变量, 起到临时存储数据的作用 11. for (int i = 0; i < array.length; i++) { // 执行冒 泡排序法 12. for (int j = i; j < array.length; j++) { 13. if (array[j] < array[i]) { 14. mid = array[i]; 15. array[i] = array[j]; 16. array[j] = mid; 17. } 18. } 19. } 20. System.out.println("\n使用冒泡法排序后的数组:"); 21. for (int i = 0; i < array.length; i++) { // 遍历排好序的array数组中的元素 22. System.out.print(" " + array[i]); // 输出数组元素 23. if ((i + 1) % 5 == 0) 24. System.out.println(); // 每5 个元素一行 25. } 26. } 27.} 数组递增排序 JAVA中常用类的常用方法 一、https://www.wendangku.net/doc/a95158772.html,ng.Object类 1、clone()方法 创建并返回此对象的一个副本。要进行“克隆”的对象所属的类必须实现https://www.wendangku.net/doc/a95158772.html,ng. Cloneable接口。 2、equals(Object obj)方法 ?功能:比较引用类型数据的等价性。 ?等价标准:引用类型比较引用,基本类型比较值。 ?存在特例:对、Date及封装类等类型来说,是比较类型及对象的内容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法返回该对象的哈希码值。 5、notify()方法唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的notify() 方法或notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 l String类 charAt(int index) 返回指定索引处的char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此String 与另一个String 比较,不考虑大小写。indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar 替换此字符串中出现的所有oldChar 得到的。split(String regex) 根据给定正则表达式的匹配拆分此字符串。 startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex 处开 JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。 <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; publicclass Test2{ publicstaticvoid main(String[] args){ int[] a={5,4,2,4,9,1}; Arrays.sort(a); //进行排序 for(int i: a){ System.out.print(i); } } } <2>冒泡排序算法 publicstaticint[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;i 例如求平方根的Math.sqrt(n),求a的b次方Math.pow(a, b),求绝对值Math.abs(n)等很多。下面是一些演示。 public class MathTest { public static void main(String[] args) { int n = 16; System.out.println(Math.sqrt(n)); System.out.println(Math.pow(2, 3)); System.out.println(Math.abs(-4)); System.out.println(Math.log10(100)); } } public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println(Math.abs(-10.4)); //10.4 System.out.println(Math.abs(10.1)); //10.1 /** * ceil天花板的意思,就是返回大的值,注意一些特殊值 */ System.out.println(Math.ceil(-10.1)); //-10.0 System.out.println(Math.ceil(10.7)); //11.0 System.out.println(Math.ceil(-0.7)); //-0.0 System.out.println(Math.ceil(0.0)); //0.0 System.out.println(Math.ceil(-0.0)); //-0.0 /** * floor地板的意思,就是返回小的值 */ System.out.println(Math.floor(-10.1)); //-11.0 System.out.println(Math.floor(10.7)); //10.0 System.out.println(Math.floor(-0.7)); //-1.0 Java程序员必知的8大排序本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例javamath类常用方法
JAVA中常用类的常用方法
java程序员必知的十种程序算法
JAVA中常用类的常用方法
JAVA数组的排序方法实例
JAVA中常用类的常用方法
JAVA中运用数组的四种排序方法
JavaMath类常用方法
java中8大排序方法