插入排序
1:基本思想
插入排序属于内部排序,将欲排序的元素以插入的方式来寻找该元素的适当位置,以达到排序的目的。
排序思想介绍:将n个待排序的元素,看成一个有序表和无序表的形式,最开始阶段有序表阶段只包含一个元素,无序表包含n-1个元素,排序过程每次从无序表中取出第一个元素,把他排序码依次与有序元素排序码进行比较,插在它的适当位置,使之成为新的有序表即可。
2:代码示例
package sort; import java.util.Arrays; public class InsertSortTest { public static void main(String[] args) { // TODO Auto-generated method stub int[] a= new int[] { 5,3,2,4,1,4,6,2,34,252,52,52,5 }; InsertSort is = new InsertSort(a); is.startSort(); is.show(); } } //插入排序:将n个特定的序列,分为有序表和无序表,开始时有序表只有1个元素,无序表有n-1个元素。在无序表中拿出第一个元素,与有序表中元素比较,放在有序表中合适位置,此时有序表为2.,无序表为n-2,依次类推 class InsertSort{ //时间复杂度为O(n^2) private int temp ;//定义变量temp,用来交换中的缓存数据 private boolean flag;//是否进行过交换的标志?false代表没有交换过,true则代表交换过 private int[] array;//待排序的数组 private int length;//待排序的数组长度 public InsertSort(int[] a) { this.array = a; this.temp = 0; this.flag = false; this.length = array.length; } public void startSort() { //从特殊到一般的方法来实现插入排序 //第一轮{5,3,2,4,1} => {3,5,2,4,1} int indexValue = array[1]; int index = 0;//带排序数据的前一个地址 // //从index+1的位置向前判断,插入位置。 // while(index>=0 && indexValue<array[index]) {//待排序的值只要小于前面的数据,且没有出界,则进行后移即可 // array[index+1] = array[index];//{5,5,2,4,1} // index--; // } // array[index+1] = indexValue;//在后移结束后,将待排序数据放在后移序列的指定位置即可! // // // //第二轮{3,5,2,4,1} => {2,3,5,4,1} // indexValue = array[2]; // index = 1;//带排序数据的前一个地址 // // //从index+1的位置向前判断,插入位置。 // while(index>=0 && indexValue<array[index]) { // array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动 // index--; // } // array[index+1] = indexValue; // // // //第三轮{3,5,2,4,1} => {2,3,4,5,1} // indexValue = array[3]; // index = 2;//带排序数据的前一个地址 // // //从index+1的位置向前判断,插入位置。 // while(index>=0 && indexValue<array[index]) {// // array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动 // index--; // } // array[index+1] = indexValue; // // //第四轮{2,3,4,5,1} => {1,2,3,5,4} // indexValue = array[4]; // index = 3;//带排序数据的前一个地址 // // //从index+1的位置向前判断,插入位置。 // while(index>=0 && indexValue<array[index]) { // array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动 // index--; // } // array[index+1] = indexValue; for(int i=1;i<array.length;i++) { indexValue = array[i]; index = i-1;//带排序数据的前一个地址 //从index+1的位置向前判断,插入位置。 while(index>=0 && indexValue<array[index]) { array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动 index--; } array[index+1] = indexValue; } } public void show() { System.out.println(Arrays.toString(array)); } }
我们采用特殊到一般的思想来假设第一轮的时候,进行array[1]数据和array[0]数据的插入排序,若小于array[0]则将array[1] = array[0],然后将前面保存的array[1]值赋给array[0]。
第二轮用array[2]的数据和array[1]的数据比较,若小于array[1],则将array[2]= array[1],然后再进行比较array[0],如果小于array[0]则重复上面操作,如果array[2]大于array[0],则退出循环,将array[1] = 原本缓存的array[2]即可。
通过特殊到一般的方法,找到循环的技巧,然后使用for循环内嵌while的方式来完成插入排序的操作。

浙公网安备 33010602011771号