本篇介绍第二种排序算法,插入排序。
插入排序一般举的例子是“整理手牌”,从牌堆中摸一张牌,放在手里,按照顺序整理好,一般是将新摸到的牌和手中已有的牌依次比较,可以从小到大也可以从大到小。然后选择合适的位置“插入”。
先看完整的代码实现,这个代码是从大到小(逆序)的方式进行比较的:
public static void InsertSort0(){
int[] a={5,1,4,8,3,9,0,2,7,6};
//1 4 5 8
for(int i=1;i<a.length;i++){
int temp = a[i];
int j=i-1;
while(j>=0&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]+ " ");
}
}
我们先分析一下,这个算法的大的流程。先选定一个待排序的元素,然后找到一个合适的位置,把元素插入进去。
核心的就是找到合适的位置。
第一步:在一个已经排好序的数组中,找到一个位置,使得当前要插入的元素放入后,其左边的都不大它,其右边的都不小于它。
这个算法用一个循环就可以搞定:
public int GetCorrectIndex(int[] a){
int temp = a[a.length-1];
int j = a.length-2;
while(j>=0 && temp<a[j]){
a[j+1] = a[j];
j--;
}
return j+1;
}
这个是在以当前的数组的最后一个元素为基准,向前进行搜索。改进为“人为指定”,增加一个重载版本:
public static int GetCorrectIndex(int[] a,int endIndex){
int temp = a[endIndex];
int j = endIndex-1;
while(j>=0 && temp<a[j]){
a[j+1] = a[j];
j--;
}
//语义:直到(条件不满足时)。。。才
return j+1;
}
这个函数,输入参数是数组a以及,这个数组中待排序的元素的索引endIndex,也就是说endIndex之前的元素都是有序的。
返回值是这个元素中合适的位置。这个位置就是带排序的元素应插入的位置。
第二步:选定一个待排序的元素,并将带排序的元素插入到合适位置:
public static void InsertSort(int a[]){
for(int i=1;i<a.length;i++){
int temp=a[i];
int endIndex=i;
int position = GetCorrectIndex(a,endIndex);
a[position]=temp;
}
}
经过这两部,就完成了插入排序,完整代码如下:
package asen.yang;
public class insertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
//InsertSort0();
int[] a={5,1,4,8,3,9,0,2,7,6};
InsertSort(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+ " ");
}
}
public int GetCorrectIndex(int[] a){
int temp = a[a.length-1];
int j = a.length-2;
while(j>=0 && temp<a[j]){
a[j+1] = a[j];
j--;
}
return j+1;
}
public static int GetCorrectIndex(int[] a,int endIndex){
int temp = a[endIndex];
int j = endIndex-1;
while(j>=0 && temp<a[j]){
a[j+1] = a[j];
j--;
}
//语义:直到(条件不满足时)。。。才
return j+1;
}
public static void InsertSort(int a[]){
for(int i=1;i<a.length;i++){
int temp=a[i];
int endIndex=i;
int position = GetCorrectIndex(a,endIndex);
a[position]=temp;
}
}
public static void InsertSort0(){
int[] a={5,1,4,8,3,9,0,2,7,6};
//1 4 5 8
for(int i=1;i<a.length;i++){
int temp = a[i];
int j=i-1;
while(j>=0&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]+ " ");
}
}
}
浙公网安备 33010602011771号