算法描述:
将待排序的数组分为2部分,一部分为已排序数组,另外一部分为待排序数组
利用2重循环,每次从待排序数组中取一个数,跟已经排序好的数组进行比较,找到插入的位置,然后移动已排序好的数组
确保每次新插入的元素都能在正确的位置,那么当带排序数组元素为0的时候,整个数组也就排序完毕。
小例子:
有一个数组 5 3 2 4 1,假设进行升序排列
那么将此数组分成两部分
已排序数组 待排序数组
初始状态 5 3 2 4 1
第一次插入3 3 5 2 4 1
第二次插入2 2 3 5 4 1
第三次插入4 2 3 4 5 1
第四次插入1 1 2 3 4 5
保证在每次插入前和插入后整个数组都是有序的,那么插入完毕整个数组就是有序的
算法效率分析
时间复杂度:需要
空间复杂度:O(1);只需要1个变量存储待排序的元素就可以,移动在原数组上进行
算法优缺点
在排序较少的数据,并且已经大致有序的数组上速度较快
在大数据量或者数据非常无序的情况下较慢,需要大量的比较以及移动数组
总结体会
有点数学归纳法的感觉 n=1时式子成立,假设n=k时式子成立,只要证明n=k+1时成立,那么整个式子就成立
当已排序好的数组只有1个元素时,数组显然有序。
假设已排序好的数组有k个元素,再插入1个元素到正确的位置,数组仍然有序,所以整个插入做下来数组是有序的
(表达得不到位..)
算法代码实现
第一次的实现,使用了额外的空间
package com.ysb;
import java.util.Random;
/**
* @author Administrator 测试各种排序方法 全部按 升序排列
*/
public class Sort {
// 数组长度
public static final int ARRAYLENGTH = 150000;
public static void main(String[] args) {
int[] randomArray = new int[ARRAYLENGTH];
for (int i = 0; i < ARRAYLENGTH; i++) {
randomArray[i] = new Random().nextInt(ARRAYLENGTH);
}
int[] sortArray = new int[ARRAYLENGTH];
for (int i = 0; i < ARRAYLENGTH; i++) {
sortArray[i] = i;
}
System.out.println("开始排序");
long startTime1 = System.currentTimeMillis();
sort1(randomArray);
long endTime1 = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
System.out.println("开始排序");
sort1(randomArray);
long endTime2 = System.currentTimeMillis();
System.out.println("使用直接插入排序排序" + ARRAYLENGTH + "个无序数中使用的时间为"
+ (endTime1 - startTime1) + "ms");
System.out.println("使用直接插入排序排序" + ARRAYLENGTH + "个有序数中使用的时间为"
+ (endTime2 - startTime2) + "ms");
}
private static void sort1(int[] array) {
// 已排好序
int[] hasSortArray = new int[array.length];
// 第一个元素为原数组的第一个元素
hasSortArray[0] = array[0];
// System.out.println("第1个数为" + hasSortArray[0]);
int count = 1;
for (int i = 1; i < array.length; i++) {
// System.out.print("已经排好序的数:");
// 取出准备排序的数据
int waitToSort = array[i];
// System.out.println();
// System.out.println("准备排序的数字 :" + waitToSort);
int j = 0;
for (j = 0; j < count; j++) {
if (waitToSort < hasSortArray[j]) {
// 小则插入
// System.out.println("找到比" + waitToSort + "大的元素,应该插入在第" + j
// + "个位置");
// System.out
// .println("从第" + j + "个元素到第" + (count-1) + "元素都往后移动1位");
int move = count - j;
for (int k = move + j; k > j; k--) {
hasSortArray[k] = hasSortArray[k - 1];
}
hasSortArray[j] = waitToSort;
break;
}
}
if (j == count) {
// System.out.println("没有比" + waitToSort + "大的元素,直接放在" + count
// + "位置");
hasSortArray[count] = waitToSort;
}
count++;
}
// System.out.println();
// System.out.println("验证100个");
// 打印100个验证
for (int i = 0; i < 100; i++) {
System.out.print(hasSortArray[i] + " ");
}
System.out.println();
}
}
分享到:
相关推荐
数据结构课件:第10章 排序1插入排序和交换排序.pptx
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...
希尔排序是插入排序的一种优化版本,通过将待排序的元素按某个增量分组,然后对每组进行插入排序,逐渐减少增量,直到增量为1,完成排序。希尔排序的时间复杂度在最坏情况下为O(n^2),但在实际应用中通常比插入排序...
7. **希尔排序**:由Donald Shell提出的改进版本的插入排序,通过设置不同的增量将待排序的序列分割成若干子序列,分别进行直接插入排序,然后逐步减小增量,直至增量为1,完成整个序列的排序。希尔排序的时间复杂度...
本项目涵盖了五种经典的排序算法:快速排序、堆排序、归并排序、插入排序和选择排序。接下来,我们将深入探讨这些算法的原理、实现及性能特点。 1. **快速排序**: 快速排序由C.A.R. Hoare在1960年提出,是一种采用...
在数据结构中,二叉排序树(Binary Search Tree,BST)是一种十分重要的数据结构,它不仅能够存储具有排序性质的数据集合,还能够高效地完成插入、查找、删除等操作。二叉排序树插入算法是维护二叉排序树性质的关键...
它通过设置间隔序列,将待排序的数组分组,然后对每组进行插入排序,逐渐减少间隔,直到间隔为1,整个序列变得有序。源码中,会看到间隔序列的设置以及插入排序的多次应用。 5. **堆排序**:堆排序是一种树形选择...
在本文中,我们将深入探讨四种经典的排序算法:插入排序、选择排序、基数排序和冒泡排序,以及它们在C++语言中的实现。 **插入排序(Insertion Sort)** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们...
4. **希尔排序**:希尔排序是插入排序的一种更高效的版本,通过将数组分为若干个子序列,然后对每个子序列进行插入排序,逐步减少子序列的间隔,直至间隔为1,最后进行一次插入排序。这种方法减少了元素的移动次数,...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
1. **希尔排序**:希尔排序是由Donald Shell提出的,它是插入排序的一种更高效的改进版本。希尔排序通过将待排序的元素按照一定的间隔分组,然后对每个组进行插入排序,随着间隔逐渐减小,最终实现整个序列的排序。...
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列的部分有序状况下,可以提高其效率。 - **实现逻辑**: - 将数组分为已排序部分和未排序部分。 - 每次从未排序部分取出...
有一个模板类写出了快速排序,冒泡排序,插入排序,选择排序四种算法。用的是C++哦
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
插入排序在实现上通常采用in-place排序(即只需用到O(1)的额外空间),因此空间效率较高。 #### 二、插入排序的基本思想 插入排序的基本思想是将待排序的数据项逐个插入到已排序好的序列中,直到所有数据项都插入...
插入排序在实现上,通常采用in-place排序(即只需要用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 在Xcode中实现插入排序,包括以下步骤: ...
1. **插入排序**: 插入排序是一种简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以使用两层循环实现,外层循环控制未排序部分,...
本文将深入探讨C#中常见的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序,以及它们的实现细节和应用场合。 首先,我们来看**冒泡排序**。冒泡排序是一种简单的交换排序方法,它通过不断比较相邻元素并交换...