面試五: 常見排序 及 算法複雜度


常見算法 及其 複雜度:java


wKiom1QjwMXy0ijJAADx1a_3Bm0154.jpg


    下面咱們看看插入排序:算法

    實現思想 : 插牌
數組

    基本思想
     假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成1個有序區,無序區爲R[2..n]。從i=2起直至i=n爲止,依次將R[i]插入當前的有序區R[1..i-1]中,生成含n個記錄的有序區。ide

    

 一般將一個記錄R[i](i=23,…,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;  //退出一趟循環 進行下一趟循環
				}
			}
		}
		
	}
}
相關文章
相關標籤/搜索