简单排序总结
1 冒泡排序
冒泡排序:这种排序是最容易理解的一种排序,就像河底的气泡往出冒一样,越来越大。冒泡排序就是用后面的和前面的比较,如果前面比后面大,那么就交换这两个值,一趟跑完了,再继续下一趟,直到全部有序。
代码实现
public class BubbleSort {
public static void sort(int[]arr){
long start =System.currentTimeMillis();
int n=arr.length;
if(n<=1){
return;
}
for(int i=0;i<n-1;i++){
boolean flag=true;
for(int j=i+1;j<n;j++){
if(arr[j]<arr[i]){
int tmp=arr[j];
arr[j]=arr[i];
arr[i]=tmp;
flag=false;
}
}
if(flag){
return;
}
}
long end=System.currentTimeMillis();
System.out.println("冒泡排序耗时"+(end-start)+"毫秒");
}
}
冒泡排序性能分析:冒泡排序采用两层for循环实现,第一层for循环表示总共需要多少轮,第二层for循环来比较冒泡。最好的情况是原本就趋向于有序,只需要遍历一遍。最坏的情况是反向有序,每次比较都需要交换。
时间复杂度:最好O(N) 最坏O(N^2) 平均O(N^2) 空间复杂度:O(1)
稳定性:稳定
2 选择排序
选择排序:选择排序的原理是将区间分为待排序区间与已排序区间,每次选取待排序区间选取最小值放在待排序区间的第一个位置,然后该位置加入已排序区间。
public class ChoiceSort {
public static void sort(int[]arr){
long start=System.currentTimeMillis();
int n=arr.length;
if(n<=1){
return;
}
int min=0;
for(int i=0;i<arr.length;i++){
min=i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min=j;
}
}
if(min!=i){
int tmp=arr[min];
arr[min]=arr[i];
arr[i]=tmp;
}
}
long end=System.currentTimeMillis();
System.out.println("选择排序耗时"+(end-start)+"毫秒");
}
}
选择排序性能分析:选择排序与冒泡排序一样,同样采用两层for循环来实现。但是其比较次数最多只进行N次,依旧是第一次for循环的次数。
时间复杂度:最好 O(N^2) 最坏O(N^2) 平均O(N^2) 空间复杂度O(1)
稳定性:不稳定
3 插入排序
插入排序:插入排序同样是分为已排序区间和待排序区间,每次从待排序区间选择一个值,插入到已排序区间中的指定位置。
public class InsertSort {
public static void sort(int[] arr){
int n=arr.length;
if(n<=1){
return;
}
for(int i=1;i<arr.length;i++){
int tmp=arr[i];
int j=i-1;
for(;j>=0;j--){
if(arr[j]>tmp){
arr[j+1]=arr[j];
}else {
break;
}
}
arr[j+1]=tmp;
}
}
}
插入排序性能分析:
时间复杂度: 最好O(N^2) 最坏O(N) 平均O(N^2) 空间复杂度:O(1)
稳定性:稳定