七大基于比较的排序方法
1.插入排序:直接插入排序;希尔排序
2.选择排序:选择排序;堆排序
3.交换排序:冒泡排序;快速排序
4.归并排序:归并排序
这是关于以上排序方法的时间复杂度,空间复杂度,稳定性的总结:
以下为代码实现冒泡排序,插入排序,选择排序,堆排序,希尔排序,测试用例从完全有序,逆序,随机产生,完全相等四个方面测试过了,没有问题,有需要的可以参考参考~
import java.util.Arrays;
import java.util.Random;
public class Main {
//冒泡排序
//时间复杂度:最好:O(n)最坏:O(n^2)
//空间复杂度:O(1)
//稳定性:稳定
//[无序][有序]
public static void bubbleSort(long[] array){
for(int i=0;i<array.length-1;i++){
boolean flag=true;
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
flag=false;
}
}
if(flag){
break;
}
}
}
private static void swap(long[] array,int i,int j){
long t=array[i];
array[i]=array[j];
array[j]=t;
}
//插入排序
//时间复杂度:O(n^2)
//空间复杂度:O(1)
//稳定性:稳定
public static void insertSort(long[] array){
for(int i=0;i<array.length-1;i++){
long key=array[i+1];
int j;
for( j=i;j>=0;j++){
if(key<array[j]){
array[j+1]=array[j];
}else{
break;
}
}
array[j+1]=key;
}
}
//选择排序
//时间复杂度:
//空间复杂度:
//稳定性:不稳定
public static void selectSort(long[] array){
for(int i=0;i<array.length-1;i++){
int maxIndex=0;
for(int j=1;j<array.length-i;j++){
if(array[j]>array[maxIndex]){
maxIndex=j;
}
}
swap(array,maxIndex,array.length-i-1);
}
}
//堆排序
//时间复杂度:O(nlog(n))
//空间复杂度:O(1)
//稳定性:不稳定
public static void heapSort(long[] array){
//建大堆 升序
createHeap(array,array.length);
for(int i=0;i<array.length+1;i++){
swap(array,0,array.length-i-1);
adjustDown(array,array.length-i-1,0);
}
}
public static void createHeap(long[] array,int size){
for(int i=(size-2)/2;i>=0;i++){
adjustDown(array,size,i);
}
}
private static void adjustDown(long[] array,int size,int index){
while(2*index+1<size){
int maxIndex=2*index+1;
if(maxIndex+1<size&&array[maxIndex]<array[maxIndex+1]){
maxIndex++;
}
if(array[index]>=array[maxIndex]){
break;
}
swap(array,maxIndex,index);
index=maxIndex;
}
}
//希尔排序
//时间复杂度:O(n) O(n^2)
//空间复杂度:O(1)
//稳定性:不稳定
public static void shellSort(long[] array){
int gap=array.length/2;
while(true){
insertSortGap(array,gap);
if(gap==1){
break;
}
gap/=2;
}
}
private static void insertSortGap(long[] array,int gap){
for(int i=gap;i<array.length;i++){
long key=array[i];
int j;
for(j=i-gap;j>=0;j=j-gap){
if(key<array[j]){
array[j+1]=array[j];
}else{
break;
}
}
}
}
谢谢各位小可爱的观看~
一起加油,一起学习everyday~