插入排序(来自百度百科)
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是一种稳定的排序方法。
思路过程
- 从第二个元素开始循环,循环比较前一个元素,找到比前一个元素小的元素num1
- 再从头开始循环找到比num1 大的元素num2,num2 元素所在的位置就是num1 元素要插入的位置
- num2(包括num2) 之后与num1之前的所有元素向后移动一个位置,注意移动元素要从后往前循环移动
- 将元素num1 插入在num2 位置上,一次插入排序完成,接着继续沿着角标循环比较,循环结束排序结束
代码实现
public static void insertSort1(int[] array){
for(int i=1; i<array.length; i++){
if(array[i-1] > array[i]) {
int temp = array[i];
for(int j=0; j<=i-1; j++){ //查找元素要插入的位置
if(array[j] > array[i]){
for(int k=i-1; k>=j; k--){ //找到插入的位置后,将对应的元素向后移动
array[k+1] = array[k];
}
array[j] = temp; //插入元素
break;
}
}
}
}
}
上面这种方式通过三个循环完成插入排序,效率性对较低。在这里补充另外一种插入排序的方法,只需要两次循环就能完成插入排序,相率较上一种方法要高。
思路过程
- 仍然是从第二个元素开始循环,循环比较前一个元素,找到比前一个元素小的元素num1
- 这次从num1 元素所在的位置往前循环,只要前一个元素比num1 大就交换位置
- 循环到第一个元素结束,一次插入排序完成,仍然保持在插入元素后序列是有序的,接着继续沿着角标循环比较,循环结束排序结束
代码实现
public static void insertSort2(int[] array){
for(int i=1; i<array.length; i++){
if(array[i-1] > array[i]){
for(int j=i; j>0; j--){
if(array[j] < array[j-1]){
int temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}
}
}