1. 程式人生 > >直接插入排序的兩種方法

直接插入排序的兩種方法

第一種方法:

插入數值替換方式:從後往前替換

package com.bhy.test_sort;

/**
 * 插入排序---方法1---從後往前替換
 * 
 * @author bhy 
 * 2018-08-03
 */
public class InsertSort {
	
	private int[] arr;
	
	public InsertSort(int[] arr) {
		this.arr = arr;
	}
	
	/**
	 * 
	 *	 插入排序--記錄原替換位置j的值,將插入的值i賦值給原替換位置j的值,迴圈替換j+1~i的值。
	 * 	【注】使用兩個變數迴圈替換,
	 * 	 m:迴圈前--先記錄原替換位置j的值 	m = arr[j];
	 * 	 n:迴圈中--記錄每次j2+1的值 	 	n = arr[j2+1];  	(初始迴圈j2 = j)
	 * 	 arr[j2+1] = m;				//將arr[j2]賦值給arr[j2+1];
	 * 	  每次迴圈後 m = n;				//更新 m 值,即: 替換arr[j2]為 arr[j2+1],準備下次迴圈;
	 */
public void insert(){ int n; int m; for (int i = 1; i < arr.length; i++) { for (int j = 0; j < i; j++) { if(arr[i] < arr[j]) { //儲存需要替換的比較值 arr[j] m = arr[j]; //先將插入值arr[i] 與比較值 arr[j] 替換 arr[j] = arr[i]; //迴圈 兩兩互換arr[j+1]~arr[i]的值 for (int j2 =
j ;j2 < i; j2++) { n = arr[j2+1]; arr[j2+1] = m; m = n; } break; } } } } }

插入數值替換方式:從前往後替換

package com.bhy.test_sort;

/**
 * 插入排序---方法1---從前往後替換
 * 
 * @author bhy 
 * 2018-08-03
 */
 
public class InsertSort2 {
	
	private int[] arr;
public InsertSort2(int[] arr) { this.arr = arr; } /** * * 插入排序--記錄將插入的值,迴圈替換j+1~i的值後,將插入值賦值給原替換位置的值。 * n: 記錄將插入的值arr[i]; */ public void insert(){ int n; for (int i = 1; i < arr.length; i++) { for (int j = 0; j < i; j++) { if(arr[i] < arr[j]) { //記錄arr[i]的值 n = arr[i]; for (int j2 = i ; j2 > j ; j2--) { arr[j2] = arr[j2-1]; } //替換arr[i]與arr[j] arr[j] = n; break; } } } } }


第二種方法(改進):

package com.bhy.test_sort;
/**
 * 插入排序---方法2
 * 
 * @author bhy 
 * 2018-08-03
 */
public class ProInsertSort {

    public static void main(String[] args){
        int[] x = { 6, 2, 7, 1, 5, 9 };
        insertion_sort(x);
        for (int i = 0; i < x.length; i++) {
			System.out.print(x[i]+" ");
		}
    }
	/**
	 * 
	 *	插入排序--改進
	 *  從下標為1開始,記錄i的值,並迴圈比較i與i-1的大小
	 * 	如: i<i-1時替換i的值為i-1值,繼續比較i原值與i-2的值...依次
	 * 	直到i>=i-1時,結束i值插入,繼續進行i+1的值插入
	 */
    public static void insertion_sort(int[] arr) {
		
		for (int i = 1; i < arr.length; i++) {
			//i<i-1時替換i的值為i-1值,繼續比較i原值與i-2的值...依次
			if(arr[i] < arr[i-1]) {
				//記錄下標為i的數值
				int value = arr[i];
				//記錄下標i
				int j = i;
				//迴圈比較j-1下標位置的數值與待插入數值value大小,依次替換相鄰的比value大的
				while(j>0 && arr[j-1]>value ) {
					arr[j] = arr[j-1];
					j--;	
				}
				//將value插入到比它大的數值的前面
				arr[j] = value;
			
			}
		}
    }

}