8種排序演算法

2021-09-23 11:20:46 字數 3201 閱讀 2489

public class sortcode 

a[j + 1] = insertnum;//找到位置,插入當前元素

}system.out.println("直接插入排序後的陣列為:" + arrays.tostring(a));}}

/*** 2.希爾排序

* * 針對直接插入排序的下效率問題,有人對次進行了改進與公升級,這就是現在的希爾排序。希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。

* 希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

* 插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率

* 但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位

* 對於直接插入排序問題,資料量巨大時。

* 將數的個數設為n,取奇數k=n/2,將下標差值為k的數分為一組,構成有序序列。

* 再取k=k/2 ,將下標差值為k的書分為一組,構成有序序列。

* 重複第二步,直到k=1執行簡單插入排序。

* * **實現:

* 首先確定分的組數。

* 然後對組中元素進行插入排序。

* 然後將length/2,重複1,2步,直到length=0為止。

*/public static class sheelsort

a[k + len] = temp;}}

}system.out.println("希爾排序後的陣列為:" + arrays.tostring(a));}}

/*** 3.簡單選擇排序

* 常用於取序列中最大最小的幾個數時。

* (如果每次比較都交換,那麼就是交換排序;如果每次比較完乙個迴圈再交換,就是簡單選擇排序。)

* 遍歷整個序列,將最小的數放在最前面。

* 遍歷剩下的序列,將最小的數放在最前面。

* 重複第二步,直到只剩下乙個數。

* * **實現:

* 首先確定迴圈次數,並且記住當前數字和當前位置。

* 將當前位置後面所有的數與當前數字進行對比,小數賦值給key,並記住小數的位置。

* 比對完成後,將最小的值與第乙個數的值交換。

* 重複2、3步。

*/public static class selectsort

}a[position] = a[i];//進行交換

a[i] = value;

}system.out.println("簡單選擇排序後的陣列為:" + arrays.tostring(a));}}

/*** 4.堆排序

* 對簡單選擇排序的優化。

* 將序列構建成大頂堆。

* 將根節點與最後乙個節點交換,然後斷開最後乙個節點。

* 重複第

一、二步,直到所有節點斷開。

*/public static class heapsort

system.out.println("堆排序後的陣列為:" + arrays.tostring(a));

}//交換方法

private void swap(int data, int i, int j)

//對data陣列從0到lastindex建大頂堆

private void buildmaxheap(int data, int lastindex)

}//如果k節點的值小於其較大的子節點的值

if (data[k] < data[biggerindex]) else }}

}}

/*** 5.氣泡排序

* 很簡單,用到的很少,據了解,面試的時候問的比較多!

* 將序列中所有元素兩兩比較,將最大的放在最後面。

* 將剩餘序列中所有元素兩兩比較,將最大的放在最後面。

* 重複第二步,直到只剩下乙個數。

* * **實現:

* 設定迴圈次數。

* 設定開始比較的位數,和結束的位數。

* 兩兩比較,將最小的放到前面去。

* 重複2、3步,直到迴圈次數完畢。

*/public static class bubblesort }}

system.out.println("氣泡排序後的陣列為:" + arrays.tostring(a));}}

/*** 6.快速排序

* 要求時間最快時。

* 選擇第乙個數為p,小於p的數放在左邊,大於p的數放在右邊。

* 遞迴的將p左邊和右邊的數都按照第一步進行,直到不能遞迴。

*/public static class quicksort

public void quicksort(int a, int start, int end)

while ((a[j] > basenum) && j > start)

if (i <= j)

} while (i <= j);

if (start < j)

if (end > i) }}

}/**

* 7.歸併排序

* 速度僅次於快速排序,記憶體少的時候使用,可以進行平行計算的時候使用。

* 選擇相鄰兩個數組成乙個有序序列。

* 選擇相鄰的兩個有序序列組成乙個有序序列。

* 重複第二步,直到全部組成乙個有序序列。

*/public static class mergesort

public static int mergesort(int a,int low,int high)

}int time = 0;

//判斷位數;

while (max > 0)

//建立10個佇列;

list> queue = new arraylist>();

for (int i = 0; i < 10; i++)

//進行time次分配和收集;

for (int i = 0; i < time; i++)

int count = 0;//元素計數器;

//收集佇列元素;

for (int k = 0; k < 10; k++) }}

system.out.println("基數排序後的陣列為:" + arrays.tostring(a));}}

public static void main(string args)

private static int getints()

return a;

}}

8種排序演算法

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說...

8種排序演算法

1.選擇排序 兩層迴圈巢狀,0到n 1選出最小的,與第0個交換,縮小集合為1到n 1,選出最小的,與第乙個交換 時間複雜度 o n2 空間複雜度 因為中間只增加了兩個新變數,儲存最小值和下標,所以空間複雜度為o 1 當陣列為已排序狀態時,仍需要n次比較,最好的情況仍需要o n2 public sta...

8種排序演算法總結

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void sortnumber method2 int array,int length ...