一、排序
1.冒泡排序
(1)原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(2)优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个两个元素中最大值,一定程度上减少了算法的量。
(3)例子
代码附上:
import java.util.*;
class BubbleSort{
public static void main(String[] args){
int[] a={9,8,15,2,4,7,19};
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
swap(a,j,j+1);
}
}
}
System.out.println(Arrays.toString(a));
}
public static void swap(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
(4)时间复杂度
如果数据正序,只需要走一趟即可完成排序。所需的比较次数为n-1,记录移动次数0,冒泡排序最好的时间复杂度为O(n)。如果数据反序,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。此时比较次数为O(n^2)移动次数为O(nn),且都达到最大。冒泡排序总的平均时间复杂度为:O(nn) ,时间复杂度和数据状况无关。
2.选择排序
(1)原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(或最大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
(2)优点:数据较小时,比冒泡排序所需时间少。
(3)例子:
代码附上:
import java.util.*;
class SelectSort{
public static void main(String[] args){
int[] a={9,8,15,2,4,7,19};
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
swap(a,i,j);
}
}
}
System.out.println(Arrays.toString(a));
}
public static void swap(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
(4)时间复杂度:O(n^2)
3.插入排序
(1)原理:从第二个元素开始一直往后,如果有数比当前面元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性。(只要前面元素小于当前元素,就可以证明前面的元素有序且都小于当前元素)
(2)优点:避免了一些不必要的比较,节省了时间。
(3)例子:
代码附上:
import java.util.*;
class InsertSort{
public static void main(String[] args){
int[] a={9,8,15,2,4,7,19};
for(int i=1;i<a.length;i++){
int e=a[i];//优化不必要的交换位置
int j=i;
while(j>0&&a[j-1]>e){
a[j]=a[j-1];
j--;
}
a[j]=e;
}
System.out.println(Arrays.toString(a));
}
public static void swap(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
(4)时间复杂度:O(n^2)
二、格式化输出
(1)System.out.printf方法可以对数据进行格式化输出,如System.out.printf("%-3d",i)。
(2)printf方法常用格式说明:
%c 单个字符、%d 十进制整数、%f 十进制浮点数、%o 八进制数、%s 字符串、%u 无符号十进制数、%x 十六进制数、%% 输出百分号%.
(3)用于printf的标志:
- 打印数字前的符号、- 左对齐、0 在数字前补0、space 在正数之前加空格、( 负数括在括号内 、, 添加分组分隔符、#(for f ) 包含小数点、#(for x or o) 添加前缀 0x 或 0、^ 转化为大写 。
(4)例子:
代码附上:
class geshihua{
public static void main(String[] args){
double i=1;
System.out.printf("%.5f",i);
System.out.println();
System.out.println(i);
}
}
由上可得:println方法输出双精度浮点数时,不能对小数的有效位数控制输出,printf方法可以控制小数有效位数的输出。