比較に基づく7つのソート方法
1.挿入ソート:直接挿入ソート;ヒルソート
2.選択ソート:選択ソート;ヒープソート
3.交換ソート:バブルソート;クイックソート
4.マージソート:マージソート
これは、上記の並べ替え方法の時間の複雑さ、スペースの複雑さ、および安定性の要約です。
以下は、バブルソート、挿入ソート、選択ソート、ヒープソート、ヒルソート、完全に順序付けられた、逆にされた、ランダムに生成された、完全に等しいテストケースを実現するためのコードです。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;
}
}
}
}
ご覧いただきありがとうございます〜
一緒に来て、毎日一緒に学んでください〜