`
edr_
  • 浏览: 168684 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

常见内部排序算法之插入排序

阅读更多
常见内部排序算法之插入排序
今天来写写插入排序算法,包括直接插入,折半插入,希尔排序(Shell)
插入插入,就是将数组分成已排序,未排序,然后将未排序中的第一个插入已排序中的适合位置,这样,未排序越来越少,直到没有就算排序完成!而默认开始则是第一个是已排序,剩下的则是未排序。
直接插入算法:
package test.aglorith;

import java.util.Arrays;

public class InsertSort {
	public static void sort(int[] data) {
		int data_len=data.length;
		for (int i = 1; i < data_len; i++) {//默认第一个(下标是0)是已排序,从未排序中的第二个(下标是1)开始
			int temp=data[i];
			int j = i-1;
			while (j >=0&&temp<data[j]) {
				data[j+1]=data[j];
				j--;
			}
			data[j+1]=temp;
			System.out.println(Arrays.toString(data));
		}
	}
	public static void main(String[] args) {
		int[] data=new int[]{10,9,8,7,6,5,4,3,2,1};
		System.out.println("排序之前"+Arrays.toString(data));
		sort(data);
	}

}

折半插入算法:
package test.aglorith;
import java.util.Arrays;

public class InsertSortBinary {
	public static void sort(int[] data) {
		int data_len=data.length;
		for (int i = 1; i < data_len; i++) {
			int temp=data[i];
			int mid=getMid(data, i);
			swapPass(data, i, mid);
			data[mid]=temp;
			System.out.println(Arrays.toString(data));
		}
	}
	public static int getMid(int[] data,int i) {
		int temp=data[i];
		int low=0;
		int hight=i-1;
		while (low<=hight) {
			int mid=(low+hight)/2;
			if (temp<data[mid]) {
				hight=mid-1;
			}else {
				low=mid+1;
			}
		}
		return low;//无论如何都是返回low,折中折中,无非最后只剩下两个的时候,选择谁作为被替代者
	}
	public static void swapPass(int[] data,int i,int mid) {
		for (int j = i; j > mid; j--) {
			data[j]=data[j-1];
		}
	}
	public static void main(String[] args) {
		int[] data=new int[]{11,10,9,8,7,6,5,4,3,2,1};
		System.out.println("排序之前"+Arrays.toString(data));
		sort(data);
	}
}

希尔排序算法:又称缩小增量排序
由于插入排序需要大量的移动数据,因此效率会受到影响。而在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量increment逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按increment*+3作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接插入排序有较大的改进。
package test.aglorith;
import java.util.Arrays;
public class ShellSort {
	//通过增量increment分组进行排序
	public static void sortByIncrement(int[] data,int increment) {
		int data_len=data.length;
		for (int i = increment; i <data_len; i++) {
			int temp=data[i];
			int j=i-increment;
			while (j>=0&&temp<data[j]){
				data[j+increment]=data[j];
				j=j-increment;
			}
			data[j+increment]=temp;
		}
		System.out.println(Arrays.toString(data));
	}
	//不同的increment分组排序,直到increment=1(相当于直接插入排序,但是由于前面的排序已经使得数组基本上处于有序状态)
	public static void sort(int[] data) {
		int increment=data.length;
		while (increment>1) {
			increment=(increment-1)/3;
			sortByIncrement(data,increment);
		}
	}
	public static void main(String[] args) {
		int[] data=new int[]{13,12,11,10,9,8,7,6,5,4,3,2,1};
		System.out.println("排序之前"+Arrays.toString(data));
		sort(data);
	}
}

分享到:
评论

相关推荐

    内部排序算法分析

    本主题将深入探讨内部排序算法,并结合C语言代码进行解析。内部排序,顾名思义,是指数据在主存储器(内存)内完成的排序过程,与外部排序相对,后者通常用于处理超出内存容量的大数据集。 1. **基本排序算法**: ...

    六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。

    本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...

    C语言数据结构内部排序算法及比较

    本文将深入探讨“C语言数据结构内部排序算法及比较”这一主题,结合个人课程作业的经验,对一些核心概念进行阐述,并对常见的内部排序算法进行比较。 首先,数据结构是组织和管理数据的方式,它包括数组、链表、树...

    内部排序算法比较 课程设计

    【内部排序算法比较课程设计】主要关注的是对六种经典的内部排序算法的性能对比,包括起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序。这些算法是计算机科学中用于对数据进行排序的基础工具,各...

    数据结构排序算法汇总包-直接插入排序 折半插入排序 2—路插入排序 表插入排序 希尔排序 起泡排序 快速排序 简单选择排序 树形选择排序 堆排序 归并排序链式基数排序

    实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...

    数据结构课程设计(内部排序算法比较_C语言)

    常见的内部排序算法包括但不限于: 1. **直接插入排序**:逐个遍历列表中的每个元素,将其插入到已排序序列的正确位置。适用于小规模数据集。 2. **冒泡排序**:重复遍历待排序序列,每次遍历时比较相邻两个元素,...

    常用的排序算法总结(各种内部排序算法和外部排序算法)

    本文将对几种常见的内部排序算法和外部排序算法进行详细总结。 首先,排序的基本定义是:给定一个包含n个记录的序列,其关键字序列分别为K1, K2, ..., Kn,如果存在一个排列p1, p2, p3, ..., pn,使得关键字满足非...

    内部排序算法比较 数据结构课程设计

    1、本演示程序对以下6种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 2、待排序表的表的元素的关键字为整数,表长不小于100;其中的数据要用伪随机数产生...

    数据机构综合课设内部排序算法比较.docx

    本篇文章将深入探讨10种常见的内部排序算法,包括它们的基本思想、比较次数和移动次数的计算,以便更直观地理解不同算法的效率。 1. **直接插入排序**: 直接插入排序是一种简单的排序算法,它通过比较新元素与已...

    内部排序算法比较

    (1) 对6种常用内部排序算法进行比较:冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序 (2) 待排序的表长不小于100,其中数据要用伪随机数产生,至少用5组不同的输入数据做比较 (3) 比较...

    内部排序算法的性能分析

    本项目针对内部排序算法进行了性能分析,通过设计一个测试程序,对比了几种常见内部排序算法的关键字比较次数和移动次数,以帮助我们更直观地理解不同算法的效率差异。以下是关于内部排序算法的一些关键知识点: 1....

    内部排序算法比较 interal sort compare

    以下是对标题和描述中提到的几种内部排序算法的详细说明: 1. **选择排序(Selection Sort)** 选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置。直到全部待...

    内部排序算法比较.rar

    (1)对以下6中常用的内部排序算法进行比较:冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序。 (2)待排序表的表长不小于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入...

    c++内部排序算法比较

    本文将深入探讨七种常见的内部排序算法:直接插入排序、折半插入排序、冒泡排序、简单选择排序、希尔排序、快速排序以及堆排序。通过对这些算法的比较次数和移动次数的分析,我们可以更好地理解它们的效率和适用场景...

    内排序算法比较,六种排序算法分析

    1) 对以下6种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于1000( 其数据用伪随机数产生),至少用5组不同的输入数据作比较;比较...

    内部排序算法的比较

    本篇文章将深入探讨六种常见的内部排序算法:希尔排序、直接选择排序、快速排序、直接插入排序、堆排序以及冒泡排序。 希尔排序是一种基于插入排序的算法,由希尔在1959年提出。它通过将待排序数组按某个增量分组,...

    课程设计 内部排序算法比较

    下面我们将深入分析几种常见的内部排序算法:冒泡排序、选择排序、快速排序、插入排序以及希尔排序,并着重讨论它们在比较次数和移动次数上的表现。 ### 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历待...

Global site tag (gtag.js) - Google Analytics