直接插入排序:时间复杂度为O(N^2),空间复杂度为O(1),稳定性:稳定。
元素越有序越快速
//直接插入排序
public static void insertSort(int[] array){
int i;
int j;
int tmp;
for(i=1;i<array.length;i++){
tmp=array[i];
for(j=i-1;j>=0;j--){
if(array[j]>tmp) {
array[j+1] = array[j];
}
else {
break;
}
}
array[j+1]=tmp;
}
}
选择排序: 时间复杂度为O(N^2),空间复杂度为O(1),稳定性:不稳定
//选择排序
public static void selectSort(int[] array){
for(int i=0;i<array.length;i++){
for (int j=i+1;j<array.length;j++){
int tmp=array[i];
if(array[i]>array[j]){
array[i]=array[j];
array[j]=tmp;
}else {
continue;
}
}
}
}
希尔排序:先把数据进行分组,在组内进行直接插入排序。所分组数不能有公约数。
时间复杂度O(N^1.3-N ^2),稳定性:不稳定
//希尔排序
private static void shell(int[] array,int gap){
int tmp=0;
int j=0;
for(int i=gap;i<array.length;i++){
tmp=array[i];
for(j=i-gap;j>=0;j=j-gap){
if(array[j]>tmp){
array[j+gap]=array[j];
}else {
break;
}
}
array[j+gap]=tmp;
}
}
public static void shellSort(int[] array){
int[] drr={5,2,1};
for (int i = 0; i <drr.length; i++) {
shell(array,drr[i]);
}
}
堆排序:效率高,时间复杂度O(N*log2N),空间复杂度O(1),稳定性:不稳定。
//堆排序
//作用:将下标为start-end之间的最大值放在start下标位置
public static void adjust(int[] array,int start,int end){
int tmp=array[start];
for(int i=2*start+1;i<=end;i=2*i+1){
//找到左右孩子中最大值的下标
if((i<end)&&array[i]<array[i+1]){
i++;
}
if(array[i]>tmp){
array[start]=array[i];
start=i;
}else if(array[i]<tmp){
break;
}
}
array[start]=tmp;
}
public static void heapSort(int[] array){
for(int i=(array.length-1-1)/2;i>=0;i--){
//第一次调整将0号下标放成最大值
adjust(array,i,array.length-1);
}
for(int j=0;j<array.length-1;j++){
//将已调整好的值放到下标为array.length-1-j中
int temp=array[array.length-1-j];
array[array.length-1-j]=array[0];