`
wjjxf
  • 浏览: 241325 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

插入排序算法学习归纳-java实现

阅读更多
学习了插入排序算法,记录下以作备查

public class InsertSort {
 
	public static void main(String[] args) {
		int[] data = {261,53,48,11,13,48,32,15}; 
//		binsort(data);
//		data = new int[]{261,53,48,48,32,15,13,11};
//		binsort(data);
//		sort2(data);
		data = new int[]{261,53,48,48,32,15,13,11};
//		sort.sort2(data);
		shellsort(data);
		for(int a: data){
			System.out.print(a+" ");
		}
	}

	/**
	 * 这样排序很失败
	 */
	public static void sort(int[] r){
		int bi=0,ci=0;
		for(int c=0; c<r.length; c++){
			for(int i=0; i< c; i++){ 
				bi++;
				if(r[c] < r[i]){
					//插入i。后移					
					int temp = r[c];
					for(int j=c;j>i;j--){
						r[j] = r[j-1];
						ci++;
					}
					r[i] = temp;
				}
			}		
		}
		System.out.println("比较="+bi+",移动="+ci);
	}
	
	/**
	 * 正宗的插入排序
	 */
	public static void sort2(int[] r){
		int bi=0,ci=0;
		//从第2个数据开始
		for(int i=1; i< r.length; i++){
			bi++;
			if(r[i] < r[i-1]){//如果比有序的最后一个小,则需要插入到前面的有序数据中
				int temp =  r[i];//保存该值,因为会被移动替换掉
				r[i] = r[i-1];//先把最后一个数据交换,无论是否需要移动,该值一定会被交换
				int j = i-2;//有序的倒数第二个
				for(;j>=0 && temp < r[j]; j--){//不越界范围类倒数找到(不断比较查找)插入位置,并且移动
					r[j+1] = r[j];
					ci++;
				}
				//替换
				r[j+1]  = temp;				
			}
		}
		
		System.out.println("比较="+bi+",移动="+ci);
	}
	
	/**
	 * 折半插入排序
	 */
	public static void binsort(int[] r){
		int bi=0,ci=0;
		
		for(int i=1; i< r.length; i++){
			int temp = r[i];//保存
			int hi = i-1, lo = 0;//查找区间
			while(lo <= hi){
				int mid = (hi + lo)/2;
				if(temp < r[mid]){
					hi = mid - 1;//折半最后一步
				}else{
					lo = mid + 1;
				}
				bi++;
			}
			//折半查找,查找到比r[hi]大比r[lo]小的这个位置
			for(int j=i-1; j> hi;j--){//移动
				r[j+1] = r[j];
				ci++;
			}
			r[hi+1] = temp;//插入
		}
		System.out.println("比较="+bi+",移动="+ci);
	}
	
	/**
	 * 希尔排序
	 */
	public static void shellsort(int[] r){
		int[] delta = {5,3,1};
		for(int k=0; k < delta.length; k++){
			shellInsert(r, 0, r.length -1, delta[k]);
		}
	}
	
	/**
	 * 以某步长进行希尔排序
	 */
	private static void shellInsert(int[] r, int low, int high, int delta){
		for(int i= low + delta; i<=high; i++){
			if(r[i] < r[i-delta]){
				int temp =  r[i];//保存该值,因为会被移动替换掉 
				int j = i-delta;//有序的倒数第二个
				for(;j>=low && temp < r[j]; j-=delta){//不越界范围类倒数找到(不断比较查找)插入位置,并且移动
					r[j+delta] = r[j]; 
				}
				//替换
				r[j+delta]  = temp;		
			}
		}
	}
}

分享到:
评论

相关推荐

    JAVA经典排序汇总

    本文以Java语言为背景,对多种排序算法进行了归纳和实践,旨在帮助读者深入理解和应用这些算法。 首先,我们来看一下Java中常见的几种排序方法: 1. **插入排序**: - **直接插入排序**:将每个元素插入到已排序...

    java排序算法.txt

    根据提供的文件信息,我们可以归纳出以下关于Java排序算法的关键知识点: ### Java排序算法概述 Java提供了多种内置排序方法,但了解基本的排序算法对于优化代码性能、深入理解数据结构及算法设计模式至关重要。本...

    java实现的数据结构与算法

    《Java实现的数据结构与算法》是一本全面介绍数据结构和算法实现的书籍,以Java语言为载体,涵盖了面向对象程序设计的基本概念和特性,并深入探讨了数据结构与算法的方方面面,包括各种数据结构的基本概念、算法的...

    数据结构与算法(JAVA语言版解密)

    通过对这些知识点的学习,读者可以深入理解Java语言的基础知识,掌握面向对象程序设计的核心概念,并学会如何利用Java实现各种数据结构和算法。这对于软件开发人员来说是非常重要的技能,能够帮助他们在实际工作中...

    数据结构JAVA

    ### 数据结构JAVA #### 一、Java与面向对象程序设计 **知识点概述:** 本章节主要介绍了Java语言的基础知识以及其面向对象的特性,并对异常处理机制进行了简要阐述。 ... - 直接插入排序的实现...

    数据结构算法JAVA

    ### 数据结构算法JAVA #### 知识点概览 本篇文档主要介绍了使用Java语言... - **直接插入排序**:介绍了直接插入排序算法。 - **折半插入排序**:介绍了折半插入排序算法。 - **希尔排序**:介绍了希尔排序算法。

    数据结构与算法java进阶(百度T5推荐)

    以上是对《数据结构与算法java进阶》所涉及知识点的详细解析,涵盖了Java基础知识、数据结构与算法的基础概念、具体实现以及高级应用等方面。这些内容不仅适合初学者入门,也适合有一定基础的开发者进一步提升自己的...

    实用数据结构与算法讲解(JAVA语言版).

    《实用数据结构与算法讲解(JAVA语言版)》这本书为初学者提供了非常全面的数据结构与算法学习资料,不仅涵盖了理论知识,还提供了大量的实践案例,有助于读者深入理解并掌握数据结构与算法的设计与实现。

    JAVA算法与数据结构

    ### JAVA算法与数据结构知识点概览 ...通过以上对《JAVA算法与数据结构》的学习,读者不仅可以掌握Java语言的基础知识,还能深入了解数据结构与算法的设计和实现方法,为今后的学习和工作打下坚实的基础。

    数据结构和算法Java

    ### 数据结构和算法Java #### Java与面向对象程序设计 - **Java语言基础知识** ...以上内容涵盖了从Java基础到高级数据结构和算法的核心知识点,不仅适合初学者入门,也为有经验的程序员提供了深入学习的机会。

    数据结构与算法 (JAVA语言版)

    ### 数据结构与算法(JAVA语言版) #### 一、Java与面向对象程序设计 本章节主要介绍了Java语言的基础知识以及其面向对象的特性。 **1.1 Java语言基础知识** - **1.1.1 基本数据类型及运算** - Java中的基本...

Global site tag (gtag.js) - Google Analytics