常見排序演算法(java)

2021-09-02 17:47:26 字數 3257 閱讀 8596

1.氣泡排序(bubblesort):

氣泡排序演算法的流程如下: 

(1)比較相鄰的元素。 

(2)對每一對相鄰元素作同樣的行為,從開始第一對到結尾的最後一對。 

(3)針對所有的元素重複以上的步驟,每一趟排好乙個數。

複雜度:o(n^2)

**實現:

public class code_00_bubblesort

for(int e = arr.length-1;e>0;e--) }}

public static void swap(int arr, int i, int j)

2.選擇排序(selectionsort):

(1)演算法思想: 每次取乙個最小值。

(2)複雜度:o(n^2)。

**實現:

public class code_02_selectionsort

for(int i = 0;i

int midindex = i;

for(int j =i+1;j

midindex = arr[j] < arr[midindex] ? j : midindex;

}swap(arr,i,midindex);}}

public static void swap(int arr, int i, int j)

3.插入排序(insertionsort):

**實現:

​​​​​​​code_01_insertionsort

for(int i = 1;i

for(int j = i-1;j>=0 && arr[j]>arr[j+1];j--) }}

public static void swap(int arr,int i,int j)

複雜度:

1.最佳情況:t(n) = o(n) ;

2.最壞情況:t(n) = o(n^2);

3.平均情況:t(n) = o(n^2);

4.歸併排序(mergesort):

歸併排序:

思想:運用分治法思想解決排序問題。

(1)設定兩個指標,分別指向待排序列的最初位置和末尾位置。

(2)比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下乙個位置。 

(3)重複步驟(3)直到某一指標達到尾部。 

(4)將另一串行剩下的所有元素直接複製到尾部。

**如下:

public class code_03_mergesort

mergesort(arr,0,arr.length-1);

}public static void mergesort(int arr, int l, int r)

int mid = l + ((r - l) >> 1);

mergesort(arr,l,mid);

mergesort(arr,mid+1,r);

merge(arr,l,mid,r);

//t(n) =2(n/2)+o(n) 

}public static void merge(int arr, int l, int m, int r)

while (p1 <= m)

while (p2 <= r)

for (i = 0; i < help.length; i++)

}複雜度: o(nlgn) 

6 快速排序(quicksort):

快速排序:

演算法思想:分治法+遞迴

演算法步驟描述: 

(1)從數列中挑出乙個元素,稱為 「基準」 

(2)重新排序數列,所有元素比基準值小的擺放在基準左邊,所有元素比基準值大的擺在基準的右邊(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。 

(3)遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

**實現:

public class code_05_quicksort

quicksort(arr,0,arr.length-1);

}public static void quicksort(int arr,int l,int r)

}private static int partition(int arr, int l, int r) else if(arr[l]>arr[r]) else

}swap(arr,more,r);

return new int ;

}private static void swap(int arr, int i, int j)

複雜度:

堆排:堆排序:

步驟: 

堆排序利用了大根堆,堆頂記錄的關鍵字最大這一特徵,使得在當前無序區中選取最大關鍵字的記錄變得簡單。

**實現:

public class code_07_heapsort

for (int i = 0; i < arr.length; i++)

int size = arr.length;

swap(arr, 0, --size);

while (size > 0)

}public static void heapinsert(int arr, int index)

}public static void heapify(int arr, int index, int size)

swap(arr, largest, index);

index = largest;

left = index * 2 + 1;}}

public static void swap(int arr, int i, int j)

​​​​​​​複雜度:

o(nlgn) 

說明:用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。

複雜度估算公式(master):

t(n) = at(n/b)+o(n^d)

①當dlogb a時,時間複雜度為o(n^d)

java常見排序演算法

package algorithms public class arraydemo int max getmax arr arr sort2 arr int start 0 int end arr.length 1 sort3 arr,start,end print arr public stati...

Java常見排序演算法

氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。public static vo...

java常見排序演算法

1.直接插入排序 public static void insertsort int array array j 1 temp system.out.println arrays.tostring array insertsort 2.希爾排序 希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高...