插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。
演算法步驟:
1)將第一待排序序列第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列。
2)從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率
但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位
希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
演算法步驟:
先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作。
演算法最開始以一定的步長進行排序,然後會繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。donald shell 最初建議步長選擇為\frac並且對步長取半直到步長達到 1。雖然這樣取可以比\mathcal(n^2)類的演算法(插入排序)更好,但這樣仍然有減少平均時間和最差時間的餘地。
以陣列為例,步長序列為
初始化關鍵字: [26, 53, 67, 48, 57, 13, 48, 32, 60, 50 ]
最後的排序結果:
13 26 32 48 48 50 53 57 60 67
**如下:
選擇排序(selection sort)也是一種簡單直觀的排序演算法。
演算法步驟:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
3)重複第二步,直到所有元素均排序完畢。
package sorting;
/** * 選擇排序
* 平均o(n^2),最好o(n^2),最壞o(n^2);空間複雜度o(1);不穩定;簡單
* @author zeng
* */
public class selectionsort
}// 將最小值放到排序序列末尾
氣泡排序(bubble sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
演算法步驟:
1)比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3)針對所有的元素重複以上的步驟,除了最後乙個。
4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
歸併排序(merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。工作原理:
1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4、重複步驟3直到某一指標達到序列尾
5、將另一串行剩下的所有元素直接複製到合併序列尾
public class mergesorttest ;
print(data);
mergesort(data);
system.out.println("排序後的陣列:");
print(data);
} public static void mergesort(int data)
public static void sort(int data, int left, int right)
/**
* 將兩個陣列進行歸併,歸併前面2個陣列已有序,歸併後依然有序
* * @param data
* 陣列物件
* @param left
* 左陣列的第乙個元素的索引
* @param center
* 左陣列的最後乙個元素的索引,center+1是右陣列第乙個元素的索引
* @param right
* 右陣列最後乙個元素的索引
*/
public static void merge(int data, int left, int center, int right) else
} // 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中乙個)
while (mid <= right)
while (left <= center)
// 將臨時陣列中的內容拷貝回原陣列中
// (原left-right範圍的內容被複製回原陣列)
while (tmp <= right)
} public static void print(int data)
system.out.println();
} }
八大排序演算法思想介紹
1.插入排序 直接插入排序 希爾排序 2.選擇排序 簡單選擇排序 堆排序 3.交換排序 氣泡排序 快速排序 4.歸併排序 5.基數排序 不穩定排序 簡單選擇排序,快速排序,希爾排序,堆排序 穩定排序 氣泡排序,直接插入排序,歸併排序,奇數排序 一.插入排序 將第乙個和第二個元素排好序,然後將第3個元...
八大排序演算法
1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...
八大排序演算法
一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...