插入排序
1.来打斗地主了哈哈哈
首先我们开始抓牌,底牌是 8 、 9 、 Q、5、 6、7 、5、 J 、K 、A (从左往右是从小到大)
第一张牌是 8,一张自然顺序是对的,手牌(8)
第二张牌是9,,需要与8比一下,发现比8大,不用动,手牌(8 、9)
第三张牌是Q,需要与9比一下,发现比9大,不用动,手牌(8、 9、Q)
第四张牌是5,需要与Q比一下,比Q小,那就交换位置手牌(8、 9、5、Q),5来到了Q的位置,继续比,以此类推,来到了第一张牌的位置,此时发现左边没有牌了,那这次插牌结束了,手牌(5、8、9、Q)
当抓到5、6、7、5、J、K都是一样的操作,目前手牌(5、5、6、7、8、9、J、Q、K)
还有最后一张A,也就是说第十张牌,需要与K比一下,比Q大,不用动,现在插牌就完成了,完成的次数和所有底牌(底牌也是10张)是一致的。
编程思路就有了呀:首先用一个for循环控制插第几张牌,然后for循环里面就是具体的插牌操作:首先与左边的牌比较,如果比左边小,那就交换,此时插的牌位置向左移了一个,以此类推,等到左边没有牌的时候就完成了。
2.具体代码实现:
package DoExercise;
public class InsSertSort{
/**
* 打印数组
* @param arr
*/
public static void printArr(int[] arr) {
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
/**
* 交换两个数
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i] ;
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 插入排序
* @param arr
*/
private static void InsertSort(int[] arr) {
if(arr == null || arr.length < 2) {
return;
}
//编程思路就有了呀:首先用一个for循环控制插第几张牌,
//然后for循环里面就是具体的插牌操作:首先与左边的牌比较,如果比左边小,那就交换,此时插的牌位置向左移了一个,以此类推,等到左边没有牌的时候就完成了。
int N = arr.length;
for(int i = 1; i < N;i++) {//首先用一个for循环控制插第几张牌,N为总牌数,从第一张开始,直到全部插完
int pre = i;//保存当前位置
while( pre - 1 >= 0 && arr[pre - 1] > arr[pre]) {//arr[pre - 1] > arr[pre]:如果比左边小,那就交换,pre - 1 >= 0 :而且保证左边都有牌才去交换
swap(arr, pre, pre - 1);//如果比左边小,那就交换
pre--;//此时插的牌位置向左移了一个
}
}
}
public static void main(String[] args) {
int[] arr = {5,4,3,2,1};//1.定义测试数据
printArr(arr); //2.打印测试数据
InsertSort(arr);//3.进行插入排序
printArr(arr); //4..打印排序后数据数据
}
}