常見算法 及其 複雜度:java
下面咱們看看插入排序:算法
實現思想 : 插牌
數組
基本思想
假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成1個有序區,無序區爲R[2..n]。從i=2起直至i=n爲止,依次將R[i]插入當前的有序區R[1..i-1]中,生成含n個記錄的有序區。ide
一般將一個記錄R[i](i=2,3,…,n-1)插入到當前的有序區,使得插入後仍保證該區間裏的記錄是按關鍵字有序的操做稱第i-1趟直接插入排序。spa
排序過程的某一中間時刻,R被劃分紅兩個子區間R[1..i-1](已排好序的有序區)和R[i..n](當前未排序的部分,可稱無序區)。orm
直接插入排序的基本操做是將當前無序區的第1個記錄R[i]插人到有序區R[1..i-1]中適當的位置上,使R[1..i]變爲新的有序區。由於這種方法每次使有序區增長1個記錄,一般稱增量法。xml
插入排序與打撲克時整理手上的牌很是相似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。爲了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較blog
java 實現排序
package cn.edu.ytu.botao.java.sort; /** * 直接插入排序 * 算法描述 : 如今有一個待排序的數組 arr[n-1] * 1) 將該待排序的數組 arr[n-1] 分紅 兩個數組一個爲有序數組 arr[0] 和一個無序數組 arr[2...n-1] * 2) 令 int i = 2 再無序的數組arr[2..n-1] 依次取出元序進行和已排好序的數組 arr[0] 中的元素進行比較,將arr[i] 插入到已排好序的數組中的合適位置。 * 3) 這樣 就會造成兩個數組一個 已排好序 arr[0...m] 待排序數組 arr[m+1...n-1] * 4) 重複執行 2) 直到全部的元素排好序爲止 * @author botao * */ public class InsertSort { public static void main(String[] args) { //須要排序的數組 int[] arr ={2 , 5, 1 , 1 , 7 , 4 }; InsertSort insertSort = new InsertSort(); insertSort.insertSort(arr); insertSort.print(arr); } public void print(int[] arr) { for (int i = 0; i < arr.length; i++) { if (i == arr.length-1) { System.out.print(arr[i]); }else { System.out.print(arr[i] + ","); } } } /** * * @param arr 待排序的數組 */ public void insertSort(int arr[]) { //數組的結束下標 int j = arr.length-1; /** * [2 , 5 , 1 , 7 , 4] * 1) [2 ] [5 , 1 ,7, 4] * 2) [2 , 5] [1 , 7 , 4] //從這裏開始進行排序 i = 1; * 3) [1 ,2 , 5] [7 , 4] * 4) [1 , 2 , 5 , 7] [4 ] * 5) [1 , 2 , 4 , 5 , 7] */ //待排序數組的開始下標 設數組的長度大於 2 int i = 1; //已排好序數組的標誌位 也就是長度 int flag = 1; for (; i < arr.length; i++) { // i 爲待排序數組的下標 //一趟排序 //k 爲已排好序的數組的下標 for (int k = 0; k < flag; k++) { //從待排序數組中取出的第一個元素比已排好序的數組中的 arr[k] 小 則將數組arr 從 k到i 的元素依次向後移動 將arr[i] 放在k位置上 if (arr[i] < arr[k]) { int temp = arr[i]; //進行數組依次向後移動 for (int k2 = i; k2 > k; k2--) { arr[k2] = arr[k2-1]; } //將 arr[i] 放在數組下標 k 的位置 arr[k] = temp; //已排好序的數組長度加1 flag++; break; //退出一趟循環 進行下一趟循環 } //從待排序數組中取出的第一個元素比已排好序的數組中的 arr[k]大或是相等而且比arr[k+1]小 則將數組arr 從 k+1到i 的元素依次向後移動 將arr[i] 放在k+1位置上 if (arr[i] >= arr[k] && arr[i] < arr[k+1]) { int temp = arr[i]; //對數組進行依次向後移動 for (int l = i; l > k+1; l--) { arr[l] = arr[l-1]; } //將 arr[i] 放到已排好數組 k+1 的位置 arr[k+1] = temp; //已排好序的數組長度加1 flag++; break; //退出一趟循環 進行下一趟循環 } } } } }