zoukankan      html  css  js  c++  java
  • 用分解的方式学算法002——插入排序

    本篇介绍第二种排序算法,插入排序。

    插入排序一般举的例子是“整理手牌”,从牌堆中摸一张牌,放在手里,按照顺序整理好,一般是将新摸到的牌和手中已有的牌依次比较,可以从小到大也可以从大到小。然后选择合适的位置“插入”。

    先看完整的代码实现,这个代码是从大到小(逆序)的方式进行比较的:

    	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]+ " ");
    		}
    	}
    
    }
    
  • 相关阅读:
    Linux中的文件夹的增删改查命令和文件的增删改查命令
    xshell开源软件
    2020090808redis之linux的gcc的升级安装(八)
    2020090807redis之windows安装(七)
    2020090806redis之理解(六)
    2020090805redis之nosql的四大分类(五)
    每个牛逼的人都有一段苦逼的岁月,但是只要像SB一样坚持,终将牛逼
    2020090804redis之数据库的搭建(四)
    2020090803redis之大数据3V+3高(三)
    2020090802redis之非关系 数据库nosql(二)
  • 原文地址:https://www.cnblogs.com/asenyang/p/8795526.html
Copyright © 2011-2022 走看看