【演算法】 簡單選擇排序與直接插入排序
阿新 • • 發佈:2019-01-13
簡單選擇排序與直接插入排序算是排序演算法裡最簡單的兩個演算法了,做個對比就更容易理解了。
簡單選擇排序
簡單選擇排序就是在要排序的陣列中,選出最小或者最大的一個數與第一個位置數進行交換,然後在剩下的數當中在找最小或者最大的數與第二個位置的數進行交換,知道第n-1個元素。下面看一下程式碼
public class StraightInsertionSort { /** * 直接插入排序 * * @param a * @param n */ public static int[] InsertSort(int a[], int n) { for (int i = 1; i < n; i++)//從第二個記錄開始,往前面的序列中插入 { if (a[i] < a[i - 1]) { //如果待排數小於前一個數,移動有序表,然後插入 int j=i-1; int x=a[i];////複製為哨兵,即儲存待排序元素 a[i]=a[i-1];//移動有序表. while (x<a[j]){ a[j+1]=a[j];//元素後移. j--; } a[j+1]=x;//為什麼賦值到j+1中,因為j--了,while不再迴圈了. } } return a; } public static void main(String[] args) { int a[]={3,12,44,5,53,61,67,84,7,88,90}; InsertSort(a,a.length); for(int i=0;i<a.length;i++) { System.out.println(a[i]); } } }
直接插入排序
直接插入排序就是先將序列的第一個記錄看成是一個有序的子序列,然後從第二個記錄逐個進行插入,直到整個序列有序為止。
public class SimpleSelectionSort { /** * 簡單選擇排序 * 在要排序的一組數中, * 選出最小(或者最大)的一個數與第1個位置的數交換; * 然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換... ... * 直到第n-1個元素(倒數第二個數)和第n個元素(最後一個數)比較為止。 */ public static int[] sort(int a[]) { int n=a.length; for(int i=0;i<n;i++) { //選擇第i個元素之後中最小的值 for(int j=i+1;j<n;j++) { int minKey=i;//儲存值最小的key.並假設第i個為最小值. for(j=i+1;j<n;j++) { if (a[j] < a[minKey])// { minKey = j; } } //交換 if(minKey!=i) { int temp=a[i]; a[i]=a[minKey]; a[minKey]=temp; } } } return a; } public static void main(String[] args) { int a[]={3,12,44,5,53,61,67,84,7,88,90}; sort(a); for(int i=0;i<a.length;i++) { System.out.println(a[i]); } } }
對比
簡單選擇排序和直接插入排序都是比較簡單的排序方法,程式碼理解起來也比較簡單。對於
這兩個排序演算法來說,我們對於序列都看成了兩個部分,分別為已排子序列和待排子序列。
直接插入排序把第1個元素看成是已排好的子序列,而後面的元素為待排序列。插入操作
就是從後面的待排序列中一個個拿出來插入到前面的已排好的子序列。
而選擇排序也是把第0個元素當成是已排好的序列,而後面的元素為待排序列。選擇操作
就是從後面的待排序列中選擇一個最大或者最小的元素然後和第一個元素進行交換。直到待排序
中的元素為0.當然我們也可以每次選擇兩個,最大的和最小的放到前面的已排好的序列。