排序演算法總結

2022-08-02 10:30:11 字數 1920 閱讀 2553

大部分演算法都是從無序區擴充套件到有序區

一、演算法概述

1.氣泡排序 o(n2),空間o(1)

每一輪從無序區冒泡出乙個最大的數到有序區

2.選擇排序o(n2),空間o(1)

每一輪從無序區選擇乙個最大的數到有序區

3.堆排序o(nlogn),空間o(1)

其實就是選擇排序的改進,每次從堆中選擇乙個最大值;

堆:父節點的值 >= 所有子節點的值

建堆:在乙個陣列中,下標為0的元素為根節點,i的子節點為2i+1和2i+2;

從右往左、從下往上的第乙個非葉子節點開始,即arr.length/2-1,與它的子節點遞迴比較。

建完堆後,產生乙個最大值,將它與最後乙個節點swap,無序區就變成了n-1,這個時候只要將根節點遞迴比較,就能產生次大值,依次下去...

public class heapsort ;

// 接下來就是排序的主體邏輯

sort(array);

system.out.println(arrays.tostring(array));

}public static void sort(int array)

for (int j = array.length - 1; j > 0; j--)

}public static void adjustheap(int array, int i, int length)

if (array[k] > temp) else }}

public static void swap(int arr, int a, int b)

}

4.插入排序o(n2),空間o(1)

在陣列大多數元素有序時有優勢

從第2個元素開始,與前面的元素比較,若小於前面的,則swap,注意要向前比較一直到不用swap。

5.希爾排序o(?),空間o(1)

假定乙個數k,如果說插入排序每次是與前面間隔1步的比較,那麼希爾排序就是與前面間隔k步的比較

k每輪減1,一直到1,這樣做其實利用插入排序的優勢。

6.歸併排序o(nlogn),空間o(n)

分治,o(n)合併

7.快速排序o(nlogn),空間o(logn)

主要難寫的就是劃分區域的部分
劃分為左區域、右區域,先從右邊掃,再從左邊掃

(各掃到乙個不滿足條件的數後,交換,進行下一輪)

temp = a[left]; //temp中存的就是基準數

i = left;

j = right;

while(i != j)

}//最終將基準數歸位

a[left] = a[i];

a[i] = temp;

為啥這個做法是正確的?

分情況討論一下即可:

兩邊若都掃到乙個不滿足a[j] > temp/<= temp 條件的,則交換;

右邊是一定會掃到,而左邊沒掃到,則可以停止了,最終將基準數歸位。

8.桶排序o(n),空間o(m)

桶即hash的那個桶

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

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