插入排序
實現一個方法,該方法的參數是int[],該方法可以對數組進行排序,例如使用【插入排序】,該方法不需要返回值。
規則:把數組分成倆部分,將後面部分的數據一個一個的和前面部分數據的元素進行比較,如果我們指定的元素比前面部分的元素小,那麼就將前面的元素往前移動一步,直到沒有比我們這個指定元素還小元素了,那麼這個位置就是需要插入的地方。
2 1 4 9 8 5 3
例如,我們可以把這個數組,從2的位置進行分開,分成倆組,左邊一組是2,右邊一組是 1 4 9 8 5 3 ,左邊一組是已經排好順序的序列,右邊一組是沒有排好順序的序列。
我們需要從右邊的待排序序列中,依次拿出每一個值,和左邊已經排好順序的數字進行比較,比較的目的是爲了給我們當前操作的右邊數字找一個合適的位置進行插入,注意這個操作元素的位置有可能是不需要移動的,因爲剛好不移動就保持了正常順序。
舉例說明:以 2 1 4 9 8 5 3 數組爲例
|
2 | 1 4 9 8 5 3
|
左邊:已經排好順序的區域
右邊:待排序區域
從右邊依次拿出一個數據,插入到左邊已經排好順序的序列中,但是需要我們找出一個合適的爲,將這個值插入。
拿到右邊一個值之後,怎麼在左邊找出一個合適的位置?
假設當前數組是處於排序中的這個狀態:
|
1 2 4 8 9 | 5 3
|
從右邊拿出一個值:5
依次和左邊排好序的數字比較,從大到小比:先和9比 在和8比 ..直到找到一個比當前數字5要的位置,那麼我們就需要把5插入到這個位置的後面,在當前這個例子中,也就是要插入到8的位置
爲了能成功的完成這個插入的操作,那麼數字9就往前移動一個位置,數字也需要往前移動一個位置,移動完之後就變成這個情況了:
當前是這種情況:
|
1 2 4 8 9 | 5 3
|
9往前移動一個位置:
|
1 2 4 8 9 | 9 3
|
8往前移動一個位置:
|
1 2 4 8 8 | 9 3
|
把我們【提前保存】下來的數字5,插入到原來8的位置:
|
1 2 4 5 8 | 9 3
|
這時候我們排序區的數字就又多了一個:
|
1 2 4 5 8 9 | 3
|
1 2 4 5 8 9 | 9
1 2 4 5 8 8 | 9
1 2 4 5 5 8 | 9
1 2 3 4 5 8 | 9
package com.briup.day1;
import java.util.Arrays;
/**
*
* @author xuan
* */
public class Inserttion {
public static void main(String[] args) {
int [] arr = {10,5,6,78,21,4};//新建一個數組
for(int i=0;i<arr.length;i++) {
int changeNum = arr[i];//需要交換的數字
int changeIndex = i-1;//前一位數的下標
while(changeIndex>=0 && changeNum<arr[changeIndex]) {
//當交換的數字前一位下標大於0並且需要交換的數字小於前一位數的時候
//把前一位數挪到後一位
arr[changeIndex+1]=arr[changeIndex];
changeIndex--;//下標減一再進行交換的數字前一位的比較
}
//因爲之前下標減一了,要得到交換的數字再加一即可
//例如當下標減爲-1時,無法進入循環因而退出,此時把需要交換的數字換到arr[0]
arr[changeIndex+1]=changeNum;
}
System.out.println(Arrays.toString(arr));//利用Arrays的toString方法打印數組
}
}