大部分演算法都是從無序區擴充套件到有序區一、演算法概述
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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...