概述:
1)插入排序(直接插入排序、希爾排序)
2)交換排序(氣泡排序、快速排序)
3)選擇排序(直接選擇排序、堆排序)
4)歸併排序
5)分配排序(基數排序)
所需輔助空間最多:歸併排序
所需輔助空間最少:堆排序
平均速度最快:快速排序
不穩定:快速排序,希爾排序,堆排序。
當n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。
快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短。
1.插入排序-直接插入排序
基本思想:
將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
code:
public static void insertsort(int array)
array[j + 1] = temp;
} }
2. 希爾排序
基本思想:
演算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。
code:
public static void shellsort(int array)
array[j + gap] = temp;
} }
}
3.氣泡排序
基本思想:重複走訪需要排序的元素,依次比較相鄰元素,如果順序不對,就調換過來,知道直到沒有元素需要再交換。
code:
public static void bubblesort(int array)
} }}
4.快速排序
基本思想:選擇乙個基點(中軸),將比基點小的元素放到基點左邊,比基點大的元素放到基點右邊,依次遞迴,直到整個序列有序
code:
public static void getmiddle(int array, int low, int high)
array[low] = array[high]; //比基點小的元素放到左邊
while (low < high && array[low] < temp)
array[high] = array[low]; //比基點大的元素放到右邊
} array[low] = temp;
return low; }
public static quicksort(int array, int low, int high)
}
5.直接選擇排序
基本思想:初始時在序列中找到最小(大)元素,放到序列的起始位置作為已排序序列;然後,再從剩餘未排序元素中繼續尋找最小(大)元素,放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
code:
public static void selectionsort(int array)
} temp = array[i];
array[i] = array[min];
array[min] = temp;
} }
6.堆排序
基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
堆的定義下:具有n個元素的序列 (h1,h2,...,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)時稱之為堆。在這裡只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最大項(大頂堆)。完全二 叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。
思想:初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為乙個堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式
code:
public static void buildmaxheap(int array, int lastindex)
}if (array[k] < array[biggerindex]) else
} } }
public static void swap(int array, int i; int j)
public static void main(string args) ;
int len = array.length;
for (int i = 0; i < len; i++)
}
7.歸併排序
基本思想:將待排序序列分為若干個子串行,每個子串行是有序的,然後將有序子串行合併成整體有序序列。
面試常用演算法總結 排序演算法(java版)
排序演算法 重要性不言而喻,很多演算法問題往往選擇乙個好的排序演算法往往問題可以迎刃而解 氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經...
排序演算法 java 版
第一 選擇排序 外層迴圈從第i個位置開始尋找最小值與i 1位置的元素進行交換,最終達到有序狀態。有點遞迴的思想,每次都是在i length中尋找最小值放在i 1的位置 第一層for迴圈,從陣列的索引1處開始向後值陣列結束,尋找最小值。public int selectsortmethod int v...
排序演算法 Java版 計數排序
計數排序通過將元素之間的大小差別轉化為陣列中下標距離進行排序,陣列下標距離代表兩元素差,陣列內的值代表這個大小的元素出現的次數 public class test int max integer.min value int min integer.max value 找出陣列中的最大最小值 for ...