九大常见排序算法
排序算法一:冒泡排序算法
基本思想:n个数比较n-1轮,第一轮有n个数,但是由于是两两比较,所以只用比较n-1次;第二轮由于前一轮结束后,最大(最小)的数已经方法第n-1位了,所以只用再比较剩下的n-1个数,要比较n-2次;以此类推,那么第i轮就要比较n-i次,所以代码为:
import java.util.Arrays;
public class Main {
public static void mP(int[]num,int size){
for(int i=1;i<size;++i){
//轮数
boolean flag=true;//标志,因为可能中间哪一轮就已经有序了
for(int j=0;j<size-i;++j){
//比较次数
if(num[j]>num[j+1]){
int tmp=num[j];
num[j]=num[j+1];
num[j+1]=tmp;
flag=false;
}
}
if(flag){
break;
}
}
}
public static void show(int[]num){
System.out.println(Arrays.toString(num));
}
public static void main(String[] args) {
int[]num=new int[]{
2,8,1,5,6,7,3};
System.out.print("冒泡排序前:");
show(num);
System.out.print("冒泡排序后:");
mP(num,7);
show(num);
}
}
运行结果:
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定
排序算法二:选择排序
基本思想:和冒泡排序类似,只不过,不是每次比较完符合条件就交换了,而是把每一轮的最大值的下标记录下来,和第n-i个元素比较然后符合交换条件时再交换,也就是说,每一轮只交换一次。代码实现:
public class Main {
public static void xZ(int[]num,int size){
for(int i=1;i<size;++i){
int index=0;//默认记录最大值的位置,这样排出来是升序
for(int j=1;j<=size-i;++j){
if(num[index]<num[j]){
//默认记录最大值的位置,这样排出来是升序
index=j;
}
}
int tmp=num[index];
num[index]=num[size-i];//和最后一个值进行交换
num[size-i]=tmp;
}
}
public static void show(int[]num){
System.out.println(Arrays.toString(num));
}
public static void main(String[] args) {
int[]num=new int[]{
2,8,1,5,0,6,7,3,10};
System.out.print("选择排序前:");
show(num);
System.out.print("选择排序后:");
xZ(num,9);
show(num);
}
}
运行结果:
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定
排序算法三:插入排序
基本思想:比较j下标的值与tmp保存的值的大小关系,如果要升序排列,那么就是j下标的值比tmp下标大的,就让num[j+1]=num[j],然后j–,直到j<0或者num[j]<num[j+1]的值为止,然后将tmp的值放到num[j+1]的位置,然后i++,每一次排序使得前i项有序。说白了就是给第tmp中存的i下标的值在前i个位置中找空位。
代码实现:
public class Main {
public static void insertSort(int[]num,int size){
for(int i=1;i<size;++i){
int tmp=num[i];
int j=i-1;
while(j>=0&&num[j]>tmp){
num[j+1]=num[j];
j--;
}
num[j+1]=tmp;
}
}
public static void show(int[]num){
System.out.println(Arrays.toString(num));
}
public static void main(String[] args) {
int[]num=new int[]{
2,8,1,5,0,6,7,3,10};
System.out.print("插入排序前:");
show(num);
System