一:插排介绍
将待排序的数据分为已排序和未排序两部分。初始时,已排序部分只包含第一个元素,未排序部分包含剩下的元素。从未排序部分取出一个元素,与已排序部分的元素逐个比较,找到合适的位置插入。如果已排序部分的元素大于当前元素,就将已排序部分的元素向后移动一位,为当前元素腾出插入位置。将当前元素插入到找到的位置,重复上述步骤,直到未排序部分为空。排序完成后,数组中的元素按照从小到大的顺序排列。
本人更推荐第一种写法因为更能体现插入的思想
第二种是本人按照自己的理解写的但好像有点不妥希望有人指正
二:代码
1:第一种
int arr[] = new int[5]; arr[0] = 5; arr[1] = 2; arr[2] = 6; arr[3] = 1; arr[4] = 9; for (int i = 1; i < arr.length; i++) { int num = arr[i]; int j = i - 1; while (j >= 0&& num < arr[j])//由于左边是排好队列的所以当发现数大于左边的队列的数的时候就算是找到了位置 { arr[j + 1] = arr[j];//因为左边的队列为顺序的所以看哨兵比左边的小几次移动几次就行 //及就是给哨兵(num)腾位置 j--; } arr[j + 1] = num;//此时j+1的位置就是哨兵要插入的位置 } for (int i = 0; i < 5; i++) { System.out.print(arr[i]+" "); }
2:第二种
int arr[] = new int[5]; arr[0] = 5; arr[1] = 2; arr[2] = 6; arr[3] = 1; arr[4] = 9; //第一种写法 for (int i = 1; i < arr.length; i++) { //插入排序直接从第二个元素开始比较 //插排的核心是用左边无序的和右边有序的进行比较插入 int num = arr[i];//右边的第一个数据为哨兵与到左边的数组中进行选择插入 for (int j = i - 1; j >= 0; j--) { //i - 1是从左边的最后一个元素开始比较 if (num < arr[j]) { int x = arr[j]; arr[j] = num; arr[j + 1] = x; } } } for (int i = 0; i < 5; i++) { System.out.print(arr[i]+" "); }
三:结果
1 2 5 6 9