zoukankan      html  css  js  c++  java
  • Java常见排序算法之直接插入排序

       在学习算法的过程中,我们难免会接触很多和排序相关的算法。总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的。

    从今天开始,我们将要进行基本的排序算法的讲解。Are you ready?Let‘s go~~~

    1、排序算法的基本概念的讲解

         时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。

         空间复杂度:分析需要多少辅助的内存。

         稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的。

                  否则我们称这个排序算法是不稳定的。

       

        排序算法的常见分类:

        1、内部排序(最常见的一种排序方式,不需要借助第三方辅助存储工具)

        2、外部排序(需要借助外部存储来辅助完成相关的排序操作)

            如果参与排序的数据元素非常的多,数据量非常的大,计算机无法把整个排序过程放到内存中进行的话,

            我们必须借助外部存储器如磁盘来完成,这种排序方式,我们称之为外部排序。

            其中外部排序最常见的就是多路归并排序,即将原始文件分解成多个能够一次性装入内存的部分,分别把每一部分调入

            内存完成相应的排序,接下来在对多个有序的外部文件进行多路归并排序。

      

       对于我们绝大多数的程序员而言,我们经常遇到的为内部排序。接下来我们将要对常见的内部排序进行相应的讲解。

        今天要讲解的内部排序为:

       直接插入排序

      1.直接插入排序的基本概念的讲解  

      直接插入排序(straight insertion sort)的做法是:
    每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
    第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;
    依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
     
    直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数
    值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小
    的并将待比较数值置入其后一位置,结束该次循环。
     
    值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排
    序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到
    全部记录插入完毕为止。

    排序方法
    1.简单方法
    首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。
    注意:若R[i]的关键字大于等于R[1..i-1]中所有记录的关键字,则R[i]就是插入原位置。
    2.改进的方法
    一种查找比较操作和记录移动操作交替地进行的方法。具体做法:
    将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:
    ① 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;
    ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。
    关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。

      2.直接插入排序的Java代码实现

       

    package com.yonyou.test;
    
    /**
     * 内部排序算法之直接插入排序
     * 默认按照从小到大进行排序操作
     * @author 小浩
     * @创建日期 2015-3-27
     */
    public class Test{
    	public static void main(String[] args) {
       //需要进行排序的数组
    	int[] array=new int[]{8,3,2,1,7,4,6,5};
    	 //输出原数组的内容
        printResult(array);
    	//直接插入排序操作
    	directInsertSort(array);
    	//输出排序后的相关结果
    	printResult(array);
    	}
    	
    	
       
    	/**
    	 * 直接插入排序的方法
    	 * @param array
    	 */
    	private static void directInsertSort(int[] array) {
           for(int i=0;i<array.length;i++)
           {
        	    for(int j=0;j<i;j++)
        	    {
        	    	if(array[i]<array[j])
        	    	{
        	    	  int temp=array[i];
        	    	  System.arraycopy(array,j,array,j+1,i-j);
        	    	  array[j]=temp;
        	    	}
        	    }
           }
    	}
    	
    
    
    	
    
    	/**
         *                                        
    	 * 输出相应数组的结果
    	 * @param array
    	 */
    	private static void printResult(int[] array) {
           for(int value:array)		
        	   System.out.print(" "+value+" ");
          System.out.println();
    	}
    
    	/**
    	 * 交换数组中两个变量的值
    	 * @param array
    	 * @param i
    	 * @param j
    	 */
    	private static void swap(int[] array,int i,int j){
    		int temp=array[i];
    		array[i]=array[j];
    		array[j]=temp;
    	}
    }
    

      

     

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/xiohao/p/4370915.html
Copyright © 2011-2022 走看看